背景信息:
我有一个由heroku托管在postgresql数据库上的应用程序。在
我已经在这个数据库中有一些数据,现在我必须在我的一个表中添加一个新行。在
通常我删除旧数据库并重新创建它。但是在将来,如果项目是实时的,我将不得不在不丢失数据的情况下更新表。在
我可以创建一个转储,删除旧数据库,然后像往常一样重新创建它。然后我可以使用一个脚本将所有现有数据上传到新的数据库中。但这感觉不对。在
我需要的:
在我目前的情况下,数据库中有博客数据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
:
它给了我一个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安装:
然后按照教程操作。在
基本上,你用你的应用进入你的文件夹并初始化alembic一次,这样它就创建了所有必要的alembic文件。在
在
alembic.ini
中,您可以更改数据库的路径(可以在本地进行更改,无需将某些内容推送到heroku)。在然后使用
alembic revision
创建一个将更改应用于数据库的脚本。您必须用编辑器打开这个创建的脚本,才能添加更改。(更多信息请参阅教程)。在最后你运行
alembic upgrade head
,就这样!在在我的例子中,这是脚本中必要的更改:
^{pr2}$相关问题 更多 >
编程相关推荐