我在 sqlalchemy 中广泛使用了 ORM 功能,因此在许多情况下,我已经从数据库中加载了数据,并且想要检查条件或对已加载的 python 对象执行计算;我还希望/需要做更多的面向批处理的任务,这些任务可以通过对数据库执行 sql 来更好地表达(并且根本不加载数据)。我想使用相同的代码来表达两种用途的相同计算,这样我就不必为数据库连接向后弯腰或将每个计算写两次(一次在常规 python 中,再次作为查询)并运行他们不同意的风险。
假设我有:
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
化到数据库然后执行查询?我特别想要一种表达子句的方法,以便它也可以在数据库查询的上下文中使用,但没有它仍然有用。
一种选择是将子句更改为函数:
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
但我发现这比表达条款的原始方式可读性差。