2017-05-15 3 views
2

私はPyObjectでSQLObjectのORMを使用していますが、私はTable.select(...)と同じ方法で(行オブジェクトの)ジェネレータを反復処理できるようにしたいが、このメソッド呼び出しを行うことで得られるものはあまりにも制限的ですさらにfilter()を使用しています。カスタムSQLObject Selectコールでジェネレータを取得できますか?

私は、このようにSQLクエリからになるだろうと同じことをしたい:

SELECT TableB.column_x, TableA.* 
FROM TableA 
INNER JOIN TableB 
ON TableA.column_y = TableB.column_z; 

私はこの正確なクエリを取得するためにSQLBuilderを使用する方法を知っている:

columns = [TableB.q.column_x, TableA.q.id] + 
    [getattr(TableA.q, col.name) for col in TableA.sqlmeta.columnList] 
inner_join = sqlbuilder.INNERJOINOn(
    table1=TableA, 
    table2=TableB, 
    on_condition=(TableA.column_y==TableB.column_z), 
) 
select = sqlbuilder.sqlbuilder.Select(items=columns, join=inner_join) 

そこから私がすることができますこのクエリを実行します。

conn = TableA._connection 
rows = conn.queryAll(conn.sqlrepr(select)) 

しかし、これはタプルのリストを返し、ないあなたがTable.select(...).filter(...)

これはTableAの「RESTORE_DEFAULTS」エンドポイント、私は戻す必要がある(デフォルト、およびのみデフォルト)行の一部であり、私はその参照する必要があるかを実行して得られるような同等の発電機既定の行はまだ存在し、ユーザーが作成した可能性のある余分なカスタム行を上書きしないで、すべての既定の行をTableAに挿入する前に削除します。言い換えれば、これは特定の要件であり、私は本当に上記のSQLクエリから拡張テーブルを使用する必要があります。

私は返されたタプル(それらから一時的なディクテーションを作成することさえも)をチェックに使用して辞書を更新できることを認識していますが、通常の処理を行うことでSQLObjectから直接のインタラクティビティを得る良い方法がありますselect()コール?

(私たちは、Python 2.4に限定しているが、私はそれが大きな違いになるとは思わない)

+1

Djangoモデルでは「注釈」機能のようなものを探していますが、SQLObjectにこのような機能はないと思います。したがって、多くのテーブルのデータを必要とする場合は、タプルだけを選択できます。 –

答えて

2
  1. 高レベルAPI(SQLOBJECT-継承されたクラス)は、一度に複数のテーブルを照会することができます(結合)、結果は常にSQLObjectインスタンスのリストになるため、あるクラスの属性のみがすぐに使用できます。これはexplained in the FAQです。 One-to-Many or Many-to-Many Relationshipsを宣言し、他のテーブルの属性にアクセスできます。 SQLObjectは行をフェッチし、自動的にSQLObjectインスタンスに変換します。

  2. 修正:SQLObject.select()はジェネレータを返しません。イテレータでは、Iterationクラスのインスタンスを返します。さらにpreciseの場合SQLObject.select()は、反復処理されるとnext()メソッド(iterator!)を呼び出すと反復クラスのインスタンスを生成し、結果をフェッチしてユーザー。

  3. さらに、反復はSelectResultsでのみ機能します。 SQLBuilderのクエリでは機能しません。

関連する問題