我有一个我正在构建的应用程序,并希望它可以移植到多个数据库,特别是MS SQL和PostgreSQL。我面临的具体问题是使用 datetime 数据类型。
例如,我想通过user_id获取以下历史记录表和分组,获取每个用户的总时间。如果time_in为Null,我需要获取当前的日期时间。
所以我的问题是,我是否需要将我的SQL Alchemy代码编写为特定于数据库?有没有办法在不使用像{的数据库特定函数的情况下实现以下查询的相同结果{1}}?
适用于SQL Server但不适用于PostgreSQL的示例查询:
datdiff
历史表:
history_timecase = case([(History.time_in == None, func.now())], else_=History.time_in)
user_list = db.session.query(History.user_id, func.sum(func.datediff(text('minute'), History.time_in, history_timecase)))\
.group_by(History.user_id).all()
答案 0 :(得分:1)
datediff()对于sql server来说太具体了。
我发布了建议解决方案的链接,其中他在postgres中使用自定义减法间隔函数:
https://groups.google.com/forum/#!topic/sqlalchemy/6mSpNTMjUGU
from sqlalchemy import func
from sqlalchemy.sql.expression import FunctionElement
from sqlalchemy.ext.compiler import compiles
class subtract_interval(FunctionElement):
type = Date()
name = 'subtract_interval'
@compiles(subtract_interval)
def compile_subtract_interval(element, compiler, **kwargs):
return '(%s::date - %s::interval)' % (
compiler.process(element.clauses.clauses[0]),
compiler.process(element.clauses.clauses[1]),
)
res = session.query(Foo).filter(
Foo.date < subtract_interval(func.now(), '3 years')
).all()