我有如下对象:
class FriendshipLike(object):
__table_args__ = (
db.UniqueConstraint('requesting_user_id', 'accepting_user_id', 'status',
name='unique_friendship'),
)
id = db.Column(db.Integer, primary_key=True, nullable=False)
date = db.Column(db.DateTime(), nullable=False,
default=datetime.datetime.now())
@declared_attr
def requesting_user_id(cls):
return db.Column('requesting_user_id', db.Integer, db.ForeignKey(
'user.id'), nullable=False)
@declared_attr
def accepting_user_id(cls):
return db.Column('accepting_user_id', db.Integer, db.ForeignKey('user.id'),
nullable=False)
和两个模型如下:
class Friendship(FriendshipLike, db.Model, CRUDMixin):
__tablename__ = 'friendship'
class Flirt(FriendshipLike, db.Model, CRUDMixin):
__tablename__ = 'flirt'
我收到了警告
SAWarning:表格中的'reques_user_id'列('friendship',MetaData(bind = None),Column('id',Integer(),table =,primary_key = True,nullable = False),列('date', DateTime(),table =,nullable = False,default = ColumnDefault(datetime.datetime(2017,5,15,10,0,47,646868))),Column('status',Enum('accepted','pending) ','跟','拒绝'),table =,nullable = False,默认= ColumnDefault('pending')),Column('reques_user_id',Integer(),ForeignKey('user.id'),table =, nullable = False),Column('accepting_user_id',Integer(),ForeignKey('user.id'),table =,nullable = False),schema = None)被Column('reques_user_id',Integer(),ForeignKey替换) ('user.id'),table =,nullable = False),它具有相同的密钥 . 考虑use_labels用于select()语句 .
有没有办法让这个警告去?或者我不应该担心它只是给我警告,以便我在发表声明时要小心?
1 回答
问题的根源是
FriendshipLike
及其子类之间共享的__table_args__
属性 . 这也应该是declared_attr
,否则使用mixin的子类的Table
实例将尝试共享相同的UniqueConstraint
对象,这似乎会导致各种奇怪的行为 . 只需将其转入declared_attr
并且警告消失了 . 有一个在mixins here中定义索引的例子 . 请注意,您不需要显式命名
declared_attr
属性返回的Column
对象,因为a column is automatically named after the attribute it is assigned to .