2016-12-01 62 views
1

背景INFOS:Python的SQLAlchemy的瓶插入新列到表 - Heroku的PostgreSQL的

我有一个由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)

我目前正在尝试在本地主机上,但到目前为止,我只得到ProgrammingError因为每次我尝试加载其中zimmer显示一个网站,它说没有列eigener_link(这是合乎逻辑的)。

我的尝试:

我tryed到try exceptProgrammingError在它发生的线,这给了我一个InternalError。在这里我tryed更新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交易已被取消。

回答

2

好吧我用alembic来解决这个问题,这很简单,花了我10分钟。

您通过PIP例如安装:

pip install alembic 

然后按照教程。

基本上你用你的app和init 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')