当两个模型在flask-sqlalchemy

时间:2017-05-15 08:17:02

标签: python flask sqlalchemy flask-sqlalchemy

我的对象如下:

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陈述时要小心?

1 个答案:

答案 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