SQLalchemy和方法内部列属性

SQLalchemy和方法内部列属性,sqlalchemy,Sqlalchemy,我有一个column\u属性,它检查一个用户可以获得多少信用: select( [func.ifnull( func.sum( orders_table.c.quantity ), 0 )], orders_table.c.user_id == users_table.c.id ).where( and_( orders_table.c.date_added < now_unix(), orders_table.c.date_expires > now

我有一个
column\u属性
,它检查一个用户可以获得多少信用:

select(
    [func.ifnull( func.sum( orders_table.c.quantity ), 0 )],
    orders_table.c.user_id == users_table.c.id
).where( and_(
    orders_table.c.date_added < now_unix(),
    orders_table.c.date_expires > now_unix(),
    orders_table.c.status == STATUS_COMPLETED
) ).label( 'userAllowedCredits' ),
deferred = True
选择(
[func.ifnull(函数和(订单\表c.数量),0)],
订单\u table.c.user\u id==用户\u table.c.id
).在何处(及_(
订单\u表c.date\u添加now\u unix(),
订单\表c.status==状态\完成
))。标签('userAllowedCredits'),
延迟=真
now\u unix()
方法返回当前unix时间戳,但问题是此方法仅加载一次,每次调用此
userAllowedCredits
属性时,查询都会基于启动应用程序时保存的相同初始值进行搜索。我需要这个
now\u unix()
方法在每次调用时返回实际的当前时间戳


我说得通吗?

您可能在启动时存储此表达式,因此现在只在启动时执行_unix()。从SqlAlchemys的角度来看,它只是一个值。如何解决这个问题,在一定程度上取决于您的用例。您可以使用,它将使用数据库内置的
now()
函数。如果您现在必须使用自己的
unix()
,您仍然可以将其作为参数传递。

使用
func.CURRENT\u TIMESTAMP()
,因为可以为func指定任何名称。如果SQLAlchemy不知道函数名,它将按原样呈现。对于SQLAlchemy知道的常见SQL函数,该名称可能会被解释为一个通用函数,该函数将被适当地编译到目标数据库中