2011-09-14 8 views
0

SQLAlchemyを使用していますが、宣言的な方法ではないため、SOAP Webサービス(動的クラス)によってデータが供給されているデータベースを作成しようとしています。Sqlalchemy ORMテーブル間の非宣言的リンク

オブジェクトのさまざまな部分の間にマッピングを作成することに問題があります。これは、テーブルが外部キーをサポートしていないMySQLのMyISAMテーブルにあるという事実により難しくなっています。

import sqlalchemy 

dbE = sqlalchemy.create_engine('create string') 
dbM = sqlalchemy.MetaData() 
dbM.bind = dbE 

class Invoice(object): 
    pass 

class LineItem(object): 
    pass 

InvoiceTbl = sqlalchemy.Table('Invoices', dbM, autoload = True) 
LineItemTbl = sqlalchemy.Table('Invoices_Items', dbM, autoload = True) 

LineItemMapper = orm.mapper(InvoiceLineItemTbl, InvoiceLineItemTbl) 
InvoiceMapper = orm.mapper(Invoice, InvoiceTbl) 

sm = orm.sessionmaker(bind = dbE, autoflush = True, autocommit = False, 
         expire_on_commit = True) 
session = orm.scoped_session(sm) 

私は、次のと別途請求書の異なる部分を照会することができます上記の使用して、オブジェクトをマッチングテーブルに存在する列に読み込まれます:私は何をしたいか

invoiceData = session.query(Invoice).filter(Invoice.InvoiceNumber.like('12345')) 
invoiceItems = session.query(LineItem).filter(LineItem.InvoiceNumber.like('12345')) 

請求書の一部としてのLineItemsを作るです:

orm.mapper(Invoice, InvoiceTbl properties={ 
    'LineItems' : orm.relation(LineItem), 
    }) 

しかし、これはそれについてのエラーで戻ってくることはunderst(2オブジェクト/テーブル間の関係について知りません外部キーが存在しないことを前提とする)。私は別のパラメータ(primaryjoin、backrefなど)を試してきましたが、これまで成功していません。

これは最善の方法ではないかもしれませんが、この特定のスクリプトはデータ駆動型であり、SOAPサービスが変更された場合には多少動的である必要があります。

編集: shahjapanのprimaryjoin引数の提案が役立ちますが、「primaryjoin条件の関係方向を判断できませんでした」というエラーが表示されますので、正しいトラックにいると想定しています。

答えて

4

ちょうどの子の外部キーを与え、それがauthomaticaly動作します、relation APIのPrimaryJoinキーワード引数を使用してみてください。

LineItme

LineItemTbl = sqlalchemy.Table('Invoices_Items', dbM, 
    Column(InvoiceNumber, ForeignKey('InvoiceTbl.InvoiceNumber), 
    autoload = True) 
+0

動作していない、私は宣言的なフォームを使用するときにのみ動作すると思います。 – David

+0

@David:それはクラス本体ではなくテーブル宣言に属します。それはこの意味でより意味がありますか? – SingleNegationElimination

+1

それは完璧に動作します! – David

1

orm.mapper(Invoice, InvoiceTbl properties={ 
    'LineItems' : orm.relation(LineItem, 
        primaryjoin='Table1.id==Table2.refid'), 
    }) 
+0

取得エラー「引数に期待列ベースの表現オブジェクトは、」私は、私は答えを得ることができるかどうかを確認するために、テーブルオブジェクトで遊んで試してみるつもりです。 – David

+0

Ok、変更されたprimaryjoin = InvoiceTbl.c.id .__ eq __(LineItemTbl.c.refid)今、私は 'primaryjoin条件の関係方向を決定できませんでした。'私が近づいていると思うのは、もしそれについて不平を言うことがすべて方向性であるならば。 – David

+0

テーブルをコピーしてMyISAMからInnoDBに変換し、外部キーをテーブルに追加しました。式(InvoiceTbl.c.InvoiceNumber == LineItemTbl.c.InvoiceNumber)の追加が機能するようになりました。どのように私はこの必要性を落とすことができますか? – David

関連する問題