SQLAlchemy-Migrate 或 Alembic 重命名模型时删除数据
SQLAlchemy-Migrate or Alembic deletes data when renaming model
我正在使用 SQLAlchemy-Migrate 来管理我的 PostgreSQL 数据库的迁移。我更改了模型的 __tablename__
,并且 运行 迁移更改了数据库中的名称,但是 table 中的所有行都被删除了。如何在不删除数据的情况下重命名模型?
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()
它删除了旧的 table 并创建了一个新的。我从未检查过其他迁移脚本,因为它们总是 运行 而不会删除数据。
SQLAlchemy-Migrate 不知道数据库中名为“contract”的 table 与代码中名为“contracts”的模型相同。它们是不同的名称,它只是做一个简单的比较。这就是为什么您 总是 检查生成的迁移脚本以确保它们做正确的事情。
从 SQLAlchemy-Migrate docs 中,使用 rename
方法重命名 table。
pre_meta.tables['contract'].rename('contracts')
如果您使用的是 Alembic(或 Flask-Alembic 或 Flask-Migrate)而不是 SQLAlchemy-Migrate,同样的事情也会发生。使用 rename_table
方法。
op.rename_table('contract', 'contracts')
我正在使用 SQLAlchemy-Migrate 来管理我的 PostgreSQL 数据库的迁移。我更改了模型的 __tablename__
,并且 运行 迁移更改了数据库中的名称,但是 table 中的所有行都被删除了。如何在不删除数据的情况下重命名模型?
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()
它删除了旧的 table 并创建了一个新的。我从未检查过其他迁移脚本,因为它们总是 运行 而不会删除数据。
SQLAlchemy-Migrate 不知道数据库中名为“contract”的 table 与代码中名为“contracts”的模型相同。它们是不同的名称,它只是做一个简单的比较。这就是为什么您 总是 检查生成的迁移脚本以确保它们做正确的事情。
从 SQLAlchemy-Migrate docs 中,使用 rename
方法重命名 table。
pre_meta.tables['contract'].rename('contracts')
如果您使用的是 Alembic(或 Flask-Alembic 或 Flask-Migrate)而不是 SQLAlchemy-Migrate,同样的事情也会发生。使用 rename_table
方法。
op.rename_table('contract', 'contracts')