我是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文档,无论我尝试什么组合,我似乎无法得到我之后的结果。
答案 0 :(得分:0)
这个怎么样:
records = Test \
.query \
.join(TestRecord) \
.filter(Test.test_number == "/START") \
.filter(TestRecord.uut_part_number == session['part_number'])
这将为您提供Test
为Test.test_number
的所有/START
条记录,并且通过加入TestRecord
,您可以按TestRecord.uut_part_number
的记录进行过滤匹配输入part_number
。
您可以Test
加入TestRecord
,因为Test
和TestRecord
之间只有一个外键字段,因此SQLalchemy知道如何加入表格。