我使用SQLAlchemy-Migrate来管理PostgreSQL数据库的迁移。我更改了模型的__tablename__
,并且运行迁移更改了数据库中的名称,但表中的所有行都被删除了。如何在不删除数据的情况下重命名模型?
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()
它删除旧表并创建一个新表。我从未检查过其他迁移脚本,因为它们总是在不丢弃数据的情况下运行。
答案 0 :(得分:2)
SQLAlchemy-Migrate不知道名为"的合同"在数据库中与名为" contract"的模型相同。在代码中。它们的名称不同,只进行简单的比较。这就是始终审核生成的迁移脚本以确保它们做正确的事情的原因。
从SQLAlchemy-Migrate docs,使用rename
方法重命名表格。
pre_meta.tables['contract'].rename('contracts')
如果您使用Alembic而不是SQLAlchemy-Migrate,则会发生同样的事情。使用rename_table
方法。
op.rename_table('contract', 'contracts')