通过父连接筛选的SQL Alchemy查询子表

时间:2018-02-13 11:05:19

标签: python sqlalchemy

我是SQL Alchemy的新手,我目前正在为工作开发一个性能工具,但却在查询中苦苦挣扎。我尝试做的是查询子表,其父表与特定过滤器匹配。

可能是我的桌子设置不正确,这使我无法做我想做的事。

以下是我的模特。

class TestRecord(db.Model):
"""

"""
    id =                    db.Column(db.Integer, primary_key=True)
    test_process =          db.Column(db.String(60))
    test_software_ident =   db.Column(db.VARCHAR(15))
    uut_part_number =       db.Column(db.VARCHAR(30))
    uut_serial_number =     db.Column(db.VARCHAR(30))
    socket_reference =      db.Column(db.VARCHAR(10))
    operator =              db.Column(db.VARCHAR(100))
    date_start =            db.Column(db.Date)
    time_start =            db.Column(db.Time)
    date_end =              db.Column(db.Date)
    time_end =              db.Column(db.Time)
    result =                db.Column(db.VARCHAR(20))
    testset_part_number =   db.Column(db.VARCHAR(10))
    testset_serial_number = db.Column(db.VARCHAR(10))
    testset_cal_date =      db.Column(db.Date)
    tests =                 db.relationship('Test', backref='test_record', lazy='dynamic')

class Test(db.Model):
"""

"""
    id = db.Column(db.Integer, primary_key=True)
    test_record_id = db.Column(db.Integer, db.ForeignKey(TestRecord.id))
    test_block = db.Column(db.VARCHAR(10))
    test_number = db.Column(db.VARCHAR(10))
    test_description = db.Column(db.Text)
    reading = db.Column(db.VARCHAR(20))
    upper_limit_exp = db.Column(db.VARCHAR(20))
    lower_limit = db.Column(db.VARCHAR(20))
    units = db.Column(db.VARCHAR(20))
    result = db.Column(db.VARCHAR(20))

我在这些表中尝试实现的是1 TestRecord可以有多个测试。

并且我试图运行的查询是针对每个测试,其test_number等于" START"它的parent.uut_part_number等于一个值。

我当前的查询是:

records = Test.query.join(Test.test_record_id, aliased=True).filter_by(test_number="/START")
                               .filter(TestRecord.uut_part_number == session['part_number'])

我一直在阅读SQL Alchemy文档,无论我尝试什么组合,我似乎无法得到我之后的结果。

1 个答案:

答案 0 :(得分:0)

这个怎么样:

records = Test \
    .query \
    .join(TestRecord) \
    .filter(Test.test_number == "/START") \
    .filter(TestRecord.uut_part_number == session['part_number'])

这将为您提供TestTest.test_number的所有/START条记录,并且通过加入TestRecord,您可以按TestRecord.uut_part_number的记录进行过滤匹配输入part_number

您可以Test加入TestRecord,因为TestTestRecord之间只有一个外键字段,因此SQLalchemy知道如何加入表格。