私は sqlalchemy の ORM 機能を多用しているため、多くの場合、データベースから既にデータをロードしており、既にロードされている Python オブジェクトの条件をチェックしたり、計算を実行したりしたいと考えています。また、データベースに対して sql を実行する (データをまったくロードしない) ことでより適切に表現される、より多くのバッチ指向のタスクを実行したい/実行する必要があります。同じコードを使用して、両方の用途で同じ計算を表現したいと思います。これにより、データベース接続のために後方に曲げたり、各計算を 2 回 (通常の Python で 1 回、再度クエリとして) 記述したり、実行したりする必要がなくなります。彼らが同意しないリスクがあります。
私が持っているとします:
from sqlalchemy import Integer, Column
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Foo(Base):
__tablename__ = 'foo'
id = Column(Integer, primary_key=True)
bar = Column(Integer)
bool_clause = Foo.bar > 10
int_clause = Foo.bar + 10
a_foo = Foo(bar=5)
入手方法はありますか
>>> something(bool_clause, a_foo)
False
>>> something(int_clause, a_foo)
15
a_foo
最初にデータベースに永続化してからクエリを実行することなく? データベースクエリのコンテキストでも使用できるように句を表現する方法が特に必要ですが、データベースクエリがなくても役立ちます。
1 つのオプションは、句を関数に変更することです。
bool_clause = lambda foo=Foo: foo.bar > 10
int_clause = lambda foo=Foo: foo.bar + 10
>>> bool_clause(a_foo)
False
>>> int_clause(a_foo)
15
しかし、これは節が表現された元の方法よりも読みにくいと思います。