2011-06-20 28 views
2

Djangoプロジェクトで複雑なクエリを実行するためにsqlalchemyを使用する最良のオプションは何ですか?私は静かであると感じましたが、多くのユーザーがいるプロジェクトのようには見えません。Djangoプロジェクトで複雑なクエリを実行するためのSqlalchemy

理由:私はプロジェクト全体で30〜40のRawQueryを持っていて、これらのクエリを維持するのは辛いです...私はSQLAlchemyがこの場合より良い経験を提供できると思います。

更新。

q = get_big_complex_sqlalachemy_query() 
mine = q.filter_by(table.c.created_by_id=1) 
closed = q.filter_by(table.c.is_closed=True) 

ジャンゴとSQLAlchemyの最大の問題は、トランザクション管理です:私は必要と

達成するための主な目標は、かつていくつかの大きな複雑なクエリを作成し、後でそれを洗練することができることです。大きなトランザクション(要求ごとに1つのトランザクション)を使用すると、SQLAlchemyはコミットするまで変更を見ません(幸いなデバッグ:)。だから私はDjango接続を使用するSQLAlchemy用のカスタム接続プールを書いた。これは理想的ではありません(SQLAlchemyはすべての選択をトランザクションでラップするのが好きで、これを無効にする方法はまだ分かりません)ので、テストで問題があります。

+0

そして、方法はありません、Django ORMはタスクまでですか? – miku

+0

@mikuたとえば、1つのテーブルに複数の結合を作成するにはどうすればよいですか? LEFT JOINタグt1 ... LEFT JOINタグt2?私が見つけた唯一の方法はRawQueryを書くことですが、sqlalchemyがこれに対してより良い方法を提供できるように見えます...少なくともSQLAlchemyを介してSQLを生成し、それをRawQueryに渡すことは可能です。 –

+0

@Vladimir:.extra(tables = ['table1'、 'table2'])の使用はどうですか? –

答えて

1

私は静かなことに慣れていませんが、私はdjangoでsqlalchemyを使用する方法は... sqlalchemyを使用すると言うことができます... djangoで!

私は過去にdjangoプロジェクトでsqlalchemyを使用していましたが、私は通常、外部データソース(django ORMによって管理されていないもの)からデータを読み込んでいました。そのことを念頭に置いて、私はSqlSoup extensionを使用する傾向がありますが、データの構造を明示的に宣言する必要はありません。 2つの異なるORMにすべてのモデルを2回書く必要はないと思うので、これはあなたにとっても良いかもしれません。

もう1つのヒント:すべてのビューでsqlalchemyが必要ない場合は、設定モジュールで接続を開かないでください。あなたのsqlalchemyコード(接続作成を含む)をそれ自身のモジュールまたはパッケージに入れてください。できるだけ孤立してください。モジュールをインポートして、本当に必要なときに接続を作成してください。

これはすべてあなたの目標が何であるかによって異なります。あなたの質問は主に読まれていますか?私は本当にあなたがしようとしていることの感覚を持っていません。

+0

質問が更新されました。 SqlSoupは素晴らしいですが、実際には、テーブル= MetaData()、reflect(bind = engine)でかなり同じ結果を得ることができます。私はDjangoモデルにそれとカスタムマッパーを使用します(クエリを実行した後、私はDjangoモデルインスタンスを取得します)。私はこのソリューションには満足していませんが、多くの場合、生のクエリから確実に前進しています。 –

+0

はい、絶対に。あなたは反射を使うことから同じことを得る。 SqlSoupは、必要に応じてショートカットです。あなたがウサギの穴を掘り下げているような気がします。正直言って、過去には、SQLを手作業でリストとして書いて、条件が満たされたときに関連する部分を追加することで、このようなことをしました。実際の問題は、トランザクション処理(更新された質問に記載されている)をどのように扱うかということであれば、それは別の話です。 –