2017-07-27 83 views
0

我使用SQLAlchemy的,迁移来管理我的PostgreSQL数据库迁移时删除数据。我改变了__tablename__一个模型,并在运行迁移数据库中更改了名称,但在表中的所有行被删除。如何在不删除数据的情况下重命名模型?SQLAlchemy的,迁移重命名模型

class Contract(db.Model): 
    __tablename__ = 'contract' 
    id = db.Column(db.Integer, primary_key=True) 
    is_valid = db.Column(db.Boolean, default=IS_VALID) 

我从contract重命名为contracts,并得到此迁移:

def upgrade(migrate_engine): 
    pre_meta.bind = migrate_engine 
    post_meta.bind = migrate_engine 
    pre_meta.tables['contract'].drop() 
    post_meta.tables['contracts'].create() 

它删除旧表,并创建一个新的。我从未检查过其他迁移脚本,因为它们始终运行而不丢弃数据。

+2

请包括您的(相关)定义,包括您的更改之前和之后以及您使用的迁移。换句话说,产生[mcve]。这听起来像是你已经在类构造完成之后试图在实时系统中为模型类“__tablename__”属性分配一个新值。正如你已经想出的那样,这将不起作用,因为相应的'Table'对象是在类构造期间由Declarative构造的。重命名PostgreSQL中的表很简单,并且不需要任何下降:'ALTER TABLE the_table重命名为another_table;'。 –

回答

2

SQLAlchemy的,迁移不知道,在数据库中名为“合同”表是一样的命名代码中的“合同”的模式。它们是不同的名称,它只是做一个简单的比较。这就是为什么你总是审查生成的迁移脚本,以确保他们做正确的事情。

SQLAlchemy-Migrate docs,重命名与rename方法的表。

pre_meta.tables['contract'].rename('contracts') 

如果您正在使用蒸馏器,而不是SQLAlchemy的,迁移,同样的事情发生。使用rename_table方法。

op.rename_table('contract', 'contracts')