[英]Querying joined tables in SQLAlchemy and displaying in an ObjectListView
我有一个ObjectListView,它显示使用SQLAlchemy从SQLite数据库检索的信息。
def setupOLV(self):
self.loanResultsOlv.SetEmptyListMsg("No Loan Records Found")
self.loanResultsOlv.SetColumns([
ColumnDefn("Date Issued", "left", 100, "date_issued",
stringConverter="%d-%m-%y"),
ColumnDefn("Card Number", "left", 100, "card_id"),
ColumnDefn("Student Number", "left", 100, "person_id"),
ColumnDefn("Forename", "left", 150, "person_fname"),
ColumnDefn("Surname", "left", 150, "person_sname"),
ColumnDefn("Reason", "left", 150, "issue_reason"),
ColumnDefn("Date Due", "left", 100, "date_due",
stringConverter="%d-%m-%y"),
ColumnDefn("Date Returned", "left", 100, "date_returned",
stringConverter="%d-%m-%y")
])
我也有三种模式,贷款:
class Loan(DeclarativeBase):
"""
Loan model
"""
__tablename__ = "loans"
id = Column(Integer, primary_key=True)
card_id = Column(Unicode, ForeignKey("cards.id"))
person_id = Column(Unicode, ForeignKey("people.id"))
date_issued = Column(Date)
date_due = Column(Date)
date_returned = Column(Date)
issue_reason = Column(Unicode(50))
person = relation("Person", backref="loans", cascade_backrefs=False)
card = relation("Card", backref="loans", cascade_backrefs=False)
人:
class Person(DeclarativeBase):
"""
Person model
"""
__tablename__ = "people"
id = Column(Unicode(50), primary_key=True)
fname = Column(Unicode(50))
sname = Column(Unicode(50))
和卡:
class Card(DeclarativeBase):
"""
Card model
"""
__tablename__ = "cards"
id = Column(Unicode(50), primary_key=True)
active = Column(Boolean)
我试图加入表格( loans
和people
),以便在我的ObjectListView中检索和显示信息。 这是我的查询方法:
def getQueriedRecords(session, filterChoice, keyword):
"""
Searches the database based on the filter chosen and the keyword
given by the user
"""
qry = session.query(Loan)
if filterChoice == "person":
result = qry.join(Person).filter(Loan.person_id=='%s' % keyword).all()
elif filterChoice == "card":
result = qry.join(Person).filter(Loan.card_id=='%s' % keyword).all()
return result
我可以检索和显示loans
表中存储的每个字段,但是我的ObjectListView中的姓氏和姓氏(应从people
表中提取并加入person.id
)是空白的。 我有SQL输出,因此我可以看到查询,而根本没有从people
表中选择查询。
如何修改查询/ ObjectListView以检索和显示此信息。 ?
更新:我创建了一个示例脚本,可在此处运行。
您只在查询贷款(qry = session.query(Loan))。 除了SELECT语句中的内容,为什么还要期待其他结果?
我承认自己对SQLAlchemy还是很陌生,但是我想我会分享我用来显示查询结果的内容。 我有一个程序使用带有4个以上表的SQLite DB,我在单个查询中从其中的2-3个中提取数据,并在ObjectListView中显示此信息。 我欠Mike Driscoll的深入教程,尤其是wxPython和SqlAlchemy:MVC和CRUD简介 。
这是我可能会在您的代码中添加/更改的内容。
在模型部分中,添加一个“显示”类,例如:
def OlvDisplay(object):
def __init__(self, date_issued, card_id, person_id, fname, sname,
issue_reason, date_due, date_returned):
self.date_issued = date_issued
self.card_id = card_id
self.person_id = person_id
self.person_fname = fname
self.person_sname = sname
self.issue_reason = issue_reason
self.date_due = date_due
self.date_returned = date_returned
此显示类在下面的convertResults定义中使用,有助于确保为ObjectListView正确格式化数据。
现有查询功能的调整:
def getQueriedRecords(session, filterChoice, keyword):
"""
Searches the database based on the filter chosen and the keyword
given by the user
"""
qry = session.query(Loan)
if filterChoice == "person":
result = qry.join(Person).filter(Loan.person_id=='%s' % keyword).all()
elif filterChoice == "card":
result = qry.join(Person).filter(Loan.card_id=='%s' % keyword).all()
convertedResults = convertResults(result)
return convertedResults
我们在这里所做的是创建一个本地变量,该变量实际上运行转换定义并存储下一行的结果,该结果返回这些结果。
和“转换器”功能:
def convertResults(results):
finalResults = []
for record in results:
result = OlvDisplay(
record.date_issued,
record.card_id,
record.person_id,
record.person.fname,
record.person.sname,
record.issue_reason,
record.date_due,
record.date_returned
)
finalResults.append(result)
return finalResults
这里重要的部分是两行:
record.person.fname
record.person.sname
由于我们希望使用已建立的关系从另一个表中提取信息,因此重要的是要引用该关系以实际查看数据。
并填充ObjectListView小部件:
theOutput = getQueriedRecords(session, filterChoice, keyword)
self.setupOLV.SetObjects(theOutput)
希望这可以帮助你。
-迈克
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.