0

我有一个 ObjectListView,它显示使用 SQLAlchemy 从 SQLite DB 检索到的信息。

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表中的每个字段,但名字和姓氏(应该从people表中绘制并加入person.id)在我的 ObjectListView 中是空白的。我有 SQL 输出,所以我可以看到查询,它根本没有从people表中选择。

如何修改我的查询/ObjectListView 以检索和显示此信息。?

更新:我创建了一个可在此处运行的示例脚本。

4

2 回答 2

1

您只查询贷款 (qry = session.query(Loan))。为什么除了 SELECT 语句中的内容之外,您还期望结果中还有其他内容?

于 2012-02-14T18:42:02.450 回答
0

我承认我自己对 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)

希望这可以帮助你。

-迈克

于 2013-11-08T21:58:40.283 回答