我的对象如下:
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','follow','denied'),table =,nullable = False,default = 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()语句。
有没有办法让这个警告出现?或者我不应该担心它只是给我警告,以便我在发表SELECT
陈述时要小心?
答案 0 :(得分:4)
问题的根源是__table_args__
及其子类之间共享的FriendshipLike
属性。这也应该是declared_attr
,否则使用mixin的子类的Table
实例将尝试共享相同的UniqueConstraint
对象,这似乎会导致各种奇怪的行为。只需将其转换为declared_attr
class FriendshipLike(object):
@declared_attr
def __table_args__(cls):
return (
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)
警告消失了。有一个在mixins here中定义索引的例子。请注意,您不需要明确命名Column
属性返回的declared_attr
对象,因为a column is automatically named after the attribute it is assigned to。