SQL Alchemy日期时间和数据库方言

时间:2017-08-01 20:27:22

标签: python sqlalchemy

我有一个我正在构建的应用程序,并希望它可以移植到多个数据库,特别是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()

1 个答案:

答案 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()