繁体   English   中英

Python Flask sqlalchemy将新列插入表 - heroku postgresql

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM