Python SQLAlchemy Migrate在重命名模型时删除数据
我正在使用SQLAlchemy Migrate来管理PostgreSQL数据库的迁移。我更改了一个模型的Python SQLAlchemy Migrate在重命名模型时删除数据,python,sqlalchemy,sqlalchemy-migrate,Python,Sqlalchemy,Sqlalchemy Migrate,我正在使用SQLAlchemy Migrate来管理PostgreSQL数据库的迁移。我更改了一个模型的\uuuuu tablename\uuuuu,运行迁移更改了数据库中的名称,但删除了表中的所有行。如何在不删除数据的情况下重命名模型 class Contract(db.Model): __tablename__ = 'contract' id = db.Column(db.Integer, primary_key=True) is_valid = db.Column(
\uuuuu tablename\uuuuu
,运行迁移更改了数据库中的名称,但删除了表中的所有行。如何在不删除数据的情况下重命名模型
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()
它删除旧表并创建一个新表。我从未检查过其他迁移脚本,因为它们总是在不删除数据的情况下运行。SQLAlchemy Migrate不知道数据库中名为“contract”的表与代码中名为“contracts”的模型相同。它们是不同的名字,它只是做一个简单的比较。这就是为什么您总是检查生成的迁移脚本,以确保它们执行正确的操作 从中,使用
rename
方法重命名表
pre_meta.tables['contract'].rename('contracts')
如果使用Alembic而不是SQLAlchemy迁移,同样的情况也会发生。使用该方法 请包括更改前后的(相关)定义,以及您使用的迁移。换言之,产生一个新的结果。听起来像是在构建类之后,您尝试将新值分配给活动系统中的模型类“
\uuuu tablename\uuuu
属性。如您所知,这将不起作用,因为相应的表
对象是在类构造期间由声明性对象构造的。在Postgresql中重命名一个表很简单,并且不需要删除任何内容:altertable将_表重命名为另一个_表代码>。
op.rename_table('contract', 'contracts')