【问题标题】:How can I do this complex foreign-key query in SQLAlchemy?如何在 SQLAlchemy 中执行这个复杂的外键查询?
【发布时间】:2017-04-05 13:48:32
【问题描述】:

我有以下 3 个 SQL Alchemy 模型

class MyModelA(db.Model):
    a_id   = db.Column(db.Integer, nullable=False, primary_key=True)
    my_field1 = db.Column(db.String(1024), unique=True)

class MyModelB(db.Model):
    b_id   = db.Column(db.Integer, nullable=False, primary_key=True)
    my_field2 = db.Column(db.String(1024), nullable=True)

    def my_method(self, arg_my_field1):
        pass # what goes here??

class MyModelC(db.Model, Timestamp):
    c_id = db.Column(db.Integer, nullable=False, primary_key=True)
    a_id = db.Column(db.Integer, db.ForeignKey(MyModelA.a_id), default=lambda: MyModelA.query.filter(MyModelA.my_field1 == 'XYZ').one().a_id)
    a = db.relationship('MyModelA', backref=db.backref('my_model_c'))
    b_id = db.Column(db.Integer, db.ForeignKey(MyModelB.b_id), nullable=False)
    b = db.relationship('MyModelB', backref=db.backref('my_model_c'))
    my_field3 = db.Column(db.String(1024), unique=True)
    __table_args__ = (db.UniqueConstraint('a_id', 'b_id', name='unique_constraint_aid_bid'),)

my_method 方法中,我想返回MyModelC 实例的my_field3 字段(指向self 并指向具有my_field1==arg_my_field1MyModelA)。应该最多有一个这样的实例。如果不存在MyModelC 的此类实例,则返回None。这个方法怎么写?

【问题讨论】:

    标签: mysql database sqlalchemy


    【解决方案1】:

    这就是答案

    def my_method(self, arg_my_field1):
        return self.my_model_c.join(MyModelA).filter(MyModelA.my_field1.ilike(arg_my_field1)).one().my_field3
    

    需要lazy='dynamic'添加到MyModelC中的两个关系中,如下图:

    class MyModelC(db.Model, Timestamp):
        c_id = db.Column(db.Integer, nullable=False, primary_key=True)
        a_id = db.Column(db.Integer, db.ForeignKey(MyModelA.a_id), default=lambda: MyModelA.query.filter(MyModelA.my_field1 == 'XYZ').one().a_id)
        a = db.relationship('MyModelA', backref=db.backref('my_model_c', lazy='dynamic'))
        b_id = db.Column(db.Integer, db.ForeignKey(MyModelB.b_id), nullable=False)    # MODIFIED
        b = db.relationship('MyModelB', backref=db.backref('my_model_c', lazy='dynamic'))    # MODIFIED
        my_field3 = db.Column(db.String(1024), unique=True)
        __table_args__ = (db.UniqueConstraint('a_id', 'b_id', name='unique_constraint_aid_bid'))
    

    【讨论】:

      猜你喜欢
      • 2017-04-05
      • 2011-09-18
      • 2015-08-05
      • 1970-01-01
      • 2023-04-08
      • 2012-01-13
      • 2011-10-20
      • 2011-01-02
      • 2014-04-21
      相关资源
      最近更新 更多