【问题标题】:Python Flask sqlalchemy Insert new column into table - heroku postgresqlPython Flask sqlalchemy 将新列插入表中 - heroku postgresql
【发布时间】:2016-12-01 10:35:57
【问题描述】:

背景信息:

我有一个由 heroku 在 postgresql 数据库上托管的应用程序。

我已经在这个数据库中有一些数据,现在我必须在我的一个表中添加一个新行。

通常我删除旧数据库并重新创建它。但将来如果项目上线,我将不得不在不丢失数据的情况下更新表格。

我可以创建一个 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 交易已被取消。

【问题讨论】:

    标签: python sql database postgresql heroku


    【解决方案1】:

    好的,我用alembic 解决了这个问题,这真的很简单,花了我大约 10 分钟。

    例如通过 pip 安装它:

    pip install alembic
    

    然后按照教程进行操作。

    基本上,您使用应用程序进入文件夹并初始化 alembic 一次,因此它会创建所有必要的 alembic 文件。

    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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 2021-01-19
      • 2019-05-18
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      相关资源
      最近更新 更多