2012-02-13 8 views
0

SQLAlchemyを使用してSQLite DBから取得した情報を表示するObjectListViewがあります。 (loansSQLAlchemyで結合テーブルを照会し、ObjectListViewに表示する

class Card(DeclarativeBase): 
    """ 
    Card model 
    """ 
    __tablename__ = "cards" 

    id = Column(Unicode(50), primary_key=True) 
    active = Column(Boolean) 

私はテーブルを結合しようとしています:

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)) 

とカード

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") 
]) 

私はまた、3つのモデル、ローンを持っていますおよび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テーブルが、forenameと姓に保存されているすべてのフィールドを取得して表示することができます(peopleテーブルから引き出されperson.idに参加する必要があります)私のObjectListViewに空白です。私はSQLの出力を持っているので、クエリを見ることができ、peopleテーブルからは全く選択されていません。

は、どのように私はこの情報を取得し、表示するために私のクエリ/ ObjectListViewを変更することができます。 ?

UPDATE:私はhere実行可能であるサンプルスクリプトを作成しました。

+0

は、その後、あなたのSQLAlchemyのはおそらく正しいではありません参加します。クエリがそのデータへのアクセス権を与えていない場合、OLVウィジェットはそのデータを表示できません。 –

+0

@Mike絶対に、私はそれを理解しており、質問には間違いがあると確信しています。私は、SQLAlchemyのチュートリアルに従って結合をクエリしてきましたが、このような事例は見当たりません。私は自分のコードが正しいかどうかわからないので(OLVの問題が解決したら)、OLVだけを言います。 – johnharris85

+0

SAコードは私にとっては正しいですが、間違っているものについては盲目にしなければなりません。ごめんなさい。 –

答えて

1

だけです(たqry = session.query(ローン))ローンを照会しています。 SELECTステートメントに含まれるもの以外に何か他のものが結果に存在すると思われるのはなぜですか?

0

私は自分自身をSQLAlchemyのためにかなり新しいですが、私は、私は私が私のクエリからの結果を表示するために使用するものを共有するだろうと思っていることを認めます。私は4 +テーブルとSQLiteのDBを使用するプログラムを持って、私はそれらの2-3のデータを1つのクエリで取得し、この情報をObjectListViewに表示します。私は彼の深いチュートリアル、特にwxPython and SqlAlchemy: An Intro to MVC and CRUDのMike Driscollに謝っています。

ここにあなたのコードに追加/変更するものがあります。お使いのモデルのセクションで

などの「表示」クラスを追加します。

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 

ここで重要な部分は、2行です:私たちはそれは確立された関係を使用して、別のテーブルから情報を引き出したいと思っているので

record.person.fname 
record.person.sname 

データを実際に見るためにはその関係を参照することが重要です。

そしてObjectListViewウィジェットを移入するには:これはあなたを助け

theOutput = getQueriedRecords(session, filterChoice, keyword) 
self.setupOLV.SetObjects(theOutput) 

希望。あなたはそれが人々のテーブルから選択していないSQLから伝えることができた場合

-MikeS

関連する問題