繁体   English   中英

在SQLAlchemy中查询联接的表并显示在ObjectListView中

[英]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)

我试图加入表格( loanspeople ),以便在我的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM