5

我正在使用 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)

我将其重命名为contracttocontracts并获得此迁移:

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

它删除旧表并创建一个新表。我从未检查过其他迁移脚本,因为它们总是在不丢失数据的情况下运行。

4

1 回答 1

18

SQLAlchemy-Migrate 并不知道数据库中名为“contracts”的表与代码中名为“contracts”的模型相同。它们是不同的名称,它只是做一个简单的比较。这就是为什么您总是查看生成的迁移脚本以确保它们做正确的事情的原因。

SQLAlchemy-Migrate 文档rename中,使用该方法重命名表。

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

如果您使用 Alembic(或 Flask-Alembic 或 Flask-Migrate)而不是 SQLAlchemy-Migrate,则会发生同样的事情。使用rename_table方法。

op.rename_table('contract', 'contracts')
于 2017-07-28T13:23:29.390 回答