[英]Python Flask sqlalchemy Insert new column into table - heroku postgresql
背景信息:
我在postgresql DB上有一个由heroku托管的应用程序。
我已经在这个数据库中有一些数据,现在我必须在我的一个表中添加一个新行。
通常我删除旧数据库并重新创建它。 但是将来如果项目是实时的,我将不得不更新表而不会丢失数据。
我可以创建一个DUMP并删除旧数据库并一如既往地重新创建它。 然后我可以使用脚本并将所有现有数据上传到新数据库中。 但这感觉不对。
我需要的:
在我目前的情况下,数据库上有博客数据table=blog
,我需要在我的table=zimmer
插入一个新列,因此blog
甚至不受影响。
class Zimmer(Base):
__tablename__ = 'zimmer'
id = Column(Integer, primary_key=True)
infofeld = Column(Text, nullable=False)
land = Column(Text, nullable=False)
bundesland = Column(Text, nullable=False)
stadt = Column(Text, nullable=False)
plz = Column(Text, nullable=False)
strasse = Column(Text, nullable=False)
hausnr = Column(Text, nullable=True)
eigener_link = Column(Text, nullable=True)
zimmer_lat = Column(Float, nullable=False)
zimmer_lng = Column(Float, nullable=False)
reingestellt_am = Column(Date, nullable=False)
这是新值: eigener_link = Column(Text, nullable=True)
我目前正在试验localhost,但到目前为止我只得到ProgrammingError
因为每当我尝试加载一个显示zimmer
的网站时,它就说没有列eigener_link
(这是合乎逻辑的)。
我做了什么:
我try except
它出现的行中的ProgrammingError
,这给了我一个InternalError
。 在这里,我尝试更新zimmer
表并添加新列eigener_link
:
try:
for page in paginator:
pages_list.append(page.number)
except ProgrammingError:
update(Zimmer).values(eigener_link='Ihr Link')
db_session.commit()
它给了我一个InternalError
。 我通过pgAdmin检查了数据库,但没有添加新值。
try:
for page in paginator:
pages_list.append(page.number)
except ProgrammingError:
db_session.execute('ALTER TABLE zimmer ADD eigener_link TEXT')
db_session.commit()
这也给了我InternalError
事务已被取消。
好吧,我用alembic来解决这个问题,这真的很容易,并把我带走了10分钟。
你可以通过pip安装它:
pip install alembic
然后按照教程进行操作。
基本上你用你的app和init alembic进入你的文件夹一次,所以它创建了所有必要的alembic文件。
在alembic.ini
您可以更改数据库的路径(您可以进行alembic.ini
更改,无需将某些内容推送到heroku)。
然后使用alembic revision
创建一个脚本,将更改应用于您的数据库。 您必须使用编辑器打开此创建的脚本,才能添加更改。 (更多在教程中)。
最后你运行了alembic upgrade head
,就是这样!
在我的情况下,这是脚本中必要的更改:
def upgrade():
op.add_column('zimmer', sa.Column('eigener_link', sa.Text))
def downgrade():
op.drop_column('zimmer', 'eigener_link')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.