Python SQLAlchemy Migrate在重命名模型时删除数据

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(

我正在使用SQLAlchemy Migrate来管理PostgreSQL数据库的迁移。我更改了一个模型的
\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')