0

レガシー データベースを使用するプロジェクトで SQLalchemy を使用しています。データベースには関数/ストアド プロシージャがあります。以前は生の SQL を使用していましたが、これらの関数をクエリのフィルターとして使用できました。
可能であれば、SQLAlchemy クエリについても同じことをしたいと思います。@hybrid_property について読んだことがありますが、これらの関数の一部には 1 つ以上のパラメーターが必要です。

一連の履歴レコードへの JOIN を持つ User モデルがあります。SUM(credit) - SUM(debit)このユーザーのこれらの履歴レコードには、日付と借方および貸方フィールドがあるため、指定された日付まで実行することにより、特定の時点でのユーザーの残高を調べることができます。
と呼ばれるデータベース関数がありますdbo.Balance(user_id, date_time)。これを使用して、特定の時点でのユーザーの残高を確認できます。

これをクエリの基準として使用して、特定の日時にマイナスの残高を持つユーザーのみを選択したいと考えています。

selection = users.filter(coalesce(Users.status, 0) == 1,
                         coalesce(Users.no_reminders, 0) == 0,
                         dbo.pplBalance(Users.user_id, datetime.datetime.now()) < -0.01).all()

これはもちろん、私がやりたいことの要点を理解するためだけに、機能しない例です。解決策はハイブリッド プロパティを使用することですが、前述したように、これらはパラメーターなしでのみ機能します (メソッドではなくプロパティであるため)。

このようなものを実装する方法についての提案 (可能であれば) は大歓迎です。

ありがとう、

4

1 に答える 1

1

@hybrid_property 自体は、特定の SQL ステートメントを生成する手段ではなく、ORM マップ クラスにクエリ生成機能を追加できるヘルパーにすぎません。

単純な関数として呼び出すことができる SQL 関数 (たとえば、「EXEC XYZ」タイプの構文を一切使用しない) は、func構造を使用して呼び出すことができます。つまり、クエリはほとんど準備ができています。

from sqlalchemy import func
selection = users.filter(coalesce(Users.status, 0) == 1,
                         coalesce(Users.no_reminders, 0) == 0,
                         func.dbo.pplBalance(Users.user_id, datetime.datetime.now()) < -0.01).all()
于 2013-10-22T03:50:09.023 に答える