Alembic 不创建复合主键
Alembic does not make composite primary key
我有一个像 -
这样的 SQLAlchemy 模型
class UserFavPlace(db.Model):
# This model stores the feedback from the user whether he has
# faved a place or not
__tablename__ = u'user_fav_places'
id = db.Column(db.Integer, primary_key = True)
public_place_id = db.Column(db.Integer, db.ForeignKey(u'public_places.id'))
user_id = db.Column(db.Integer, db.ForeignKey(u'users.user_id'))
fav = db.Column(db.Boolean)
updated_time = db.Column(db.DateTime)
place = relationship(u'PublicPlace', backref = u'user_fav_places')
user = relationship(u'User', backref = u'user_fav_places')
然后我将此模型更改为以下 -
class UserFavPlace(db.Model):
# This model stores the feedback from the user whether he has
# faved a place or not
__tablename__ = u'user_fav_places'
public_place_id = db.Column(db.Integer, db.ForeignKey(u'public_places.id'),
primary_key = True)
user_id = db.Column(db.Integer, db.ForeignKey(u'users.user_id'),
primary_key = True)
fav = db.Column(db.Boolean)
updated_time = db.Column(db.DateTime)
place = relationship(u'PublicPlace', backref = u'user_fav_places')
user = relationship(u'User', backref = u'user_fav_places')
但是,Alembic 没有生成正确的升级和降级语句。好像没有加入新引入的主键约束。
def upgrade():
### commands auto generated by Alembic - please adjust! ###
op.drop_column('user_fav_places', 'id')
### end Alembic commands ###
def downgrade():
### commands auto generated by Alembic - please adjust! ###
op.add_column('user_fav_places', sa.Column('id', mysql.INTEGER(display_width=11), nullable=False))
### end Alembic commands ###
我不确定如何添加它。
我发现自动生成在检测 primary/foreign 键更改方面非常糟糕。没关系,通常您无论如何都想自定义它们。
我还没有创建复合主键,但根据文档看来这应该可行:
http://alembic.zzzcomputing.com/en/latest/ops.html#alembic.operations.Operations.create_primary_key
op.create_primary_key(
"pk_user_fav_places", "user_fav_places",
["public_place_id", "user_id"]
)
但是,您可能 运行 遇到不同的问题,我在这里写了这个问题:Adding primary key to existing MySQL table in alembic
这可能已在较新版本的 alembic 中得到修复,但它可能不允许您在现有表上创建主键(请参阅上面的答案了解原因)。如果发生这种情况,您可以自己制作 SQL 并使用 op.execute 运行。
希望对您有所帮助!
我有一个像 -
这样的 SQLAlchemy 模型class UserFavPlace(db.Model):
# This model stores the feedback from the user whether he has
# faved a place or not
__tablename__ = u'user_fav_places'
id = db.Column(db.Integer, primary_key = True)
public_place_id = db.Column(db.Integer, db.ForeignKey(u'public_places.id'))
user_id = db.Column(db.Integer, db.ForeignKey(u'users.user_id'))
fav = db.Column(db.Boolean)
updated_time = db.Column(db.DateTime)
place = relationship(u'PublicPlace', backref = u'user_fav_places')
user = relationship(u'User', backref = u'user_fav_places')
然后我将此模型更改为以下 -
class UserFavPlace(db.Model):
# This model stores the feedback from the user whether he has
# faved a place or not
__tablename__ = u'user_fav_places'
public_place_id = db.Column(db.Integer, db.ForeignKey(u'public_places.id'),
primary_key = True)
user_id = db.Column(db.Integer, db.ForeignKey(u'users.user_id'),
primary_key = True)
fav = db.Column(db.Boolean)
updated_time = db.Column(db.DateTime)
place = relationship(u'PublicPlace', backref = u'user_fav_places')
user = relationship(u'User', backref = u'user_fav_places')
但是,Alembic 没有生成正确的升级和降级语句。好像没有加入新引入的主键约束。
def upgrade():
### commands auto generated by Alembic - please adjust! ###
op.drop_column('user_fav_places', 'id')
### end Alembic commands ###
def downgrade():
### commands auto generated by Alembic - please adjust! ###
op.add_column('user_fav_places', sa.Column('id', mysql.INTEGER(display_width=11), nullable=False))
### end Alembic commands ###
我不确定如何添加它。
我发现自动生成在检测 primary/foreign 键更改方面非常糟糕。没关系,通常您无论如何都想自定义它们。
我还没有创建复合主键,但根据文档看来这应该可行:
http://alembic.zzzcomputing.com/en/latest/ops.html#alembic.operations.Operations.create_primary_key
op.create_primary_key(
"pk_user_fav_places", "user_fav_places",
["public_place_id", "user_id"]
)
但是,您可能 运行 遇到不同的问题,我在这里写了这个问题:Adding primary key to existing MySQL table in alembic
这可能已在较新版本的 alembic 中得到修复,但它可能不允许您在现有表上创建主键(请参阅上面的答案了解原因)。如果发生这种情况,您可以自己制作 SQL 并使用 op.execute 运行。
希望对您有所帮助!