【发布时间】:2017-03-30 01:47:09
【问题描述】:
我有一个 SqlAlchemy/Flask 应用程序。在其中,我有一个名为 MyModelA 的现有模型。这是它的样子:
class MyModelA(db.Model):
a_id = db.Column(db.Integer, nullable=False, primary_key=True)
my_field1 = db.Column(db.String(1024), nullable=True)
现在,我正在添加一个子模型MyModelB。这是它的样子:
class MyModelB(db.Model):
b_id = db.Column(db.Integer, nullable=False, primary_key=True)
a_id = db.Column(db.Integer, db.ForeignKey(MyModelA.a_id), nullable=False)
my_field2 = db.Column(db.String(1024), nullable=True)
然后我运行python manage.py migrate。这是迁移文件中显示的内容:
def upgrade():
op.create_table('my_model_b',
sa.Column('b_id', sa.Integer(), nullable=False),
sa.Column('a_id', sa.Integer(), nullable=False),
sa.Column('my_field2', sa.String(length=1024), nullable=True),
sa.ForeignKeyConstraint(['a_id'], [u'my_model_a.a_id'], ),
sa.PrimaryKeyConstraint('b_id')
)
def downgrade():
op.drop_table('my_table_b')
我想编辑此迁移,以便为MyModelA 的每个实例创建实例MyModelB 的子记录,并将MyModelB.my_field2 设置为MyModelA.my_field1。我该怎么做?
请出示升级和降级代码。
【问题讨论】:
-
您可以在迁移脚本中编写任何数据库代码,基本限制是您不能使用 ORM 模型,而需要使用 SQLAlchemy 核心或普通 SQL。这是一篇包含一些示例的文章:julo.ch/blog/migrating-content-with-alembic。在您的示例中,降级不需要更改,顺便说一下,只需升级。
-
米格尔,谢谢。您如何使用
connection.execute()函数进行记录插入?它没有在那里显示。以及如何获取刚刚插入的记录的主键? -
SQLAlchemy 文档:docs.sqlalchemy.org/en/latest/core/dml.html
标签: python sqlalchemy flask-sqlalchemy database-migration flask-migrate