使用Postgresql使Sqlalchemy在过滤器中使用日期

Pyt*_*olf 19 postgresql datetime sqlalchemy

我正在尝试在Sqlalchemy中执行以下查询.

Select * from "Mytable" where Date(date_time_field) = "2011-08-16";
Run Code Online (Sandbox Code Playgroud)

我尝试了几种方法.有些人在这里.但似乎没有一个看起来"现实",因为有些人会施放其他字符串格式?!?!并且不是简单的Date()(按日期我的意思是Postgresql日期而不是Python One)在ORM字段.

是否可以在ORM级别在查询字段周围声明一个简单日期()?

最好的问候安东尼奥

Pyt*_*olf 50

使用@Ants Aasma评论.

并保持其清洁任何网络搜索.

from sqlalchemy import Date, cast
from datetime import date

my_data = session.query(MyObject).\
filter(cast(MyObject.date_time,Date) == date.today()).all()
Run Code Online (Sandbox Code Playgroud)

谢谢所有试图解决这个问题的人:)

  • 根据我的经验,如果您使用SQLite进行测试,`func.date`会更好,因为`cast`不起作用。 (2认同)

Zuz*_*leb 12

可以使用using func模块调用本机SQL函数

from sqlalchemy import func
from datetime import date

my_data = session.query(MyObject).filter(
    func.date(MyObject.date_time) == date.today()
).all()
Run Code Online (Sandbox Code Playgroud)

调用 func.date

 from sqlalchemy import select, func
 print select([func.date('2004-10-19 10:23:54')])
Run Code Online (Sandbox Code Playgroud)

将产生以下SQL:

 SELECT date(:date_2) AS date_1
Run Code Online (Sandbox Code Playgroud)

您还可以声明自己的SQL函数快捷方式:

from sqlalchemy.sql.functions import GenericFunction
from sqlalchemy.types import DateTime

class convert_tz(GenericFunction):
    """
    Sqlalchemy shortcut to SQL convert timezone function

    :param DateTime datetime
    :param str from_tz: The timezone the datetime will be converted from
    :param str to_tz: The timezone the datetime will be converted from
    :returns: Datetime in another timezone
    :rtype: DateTime or None if timezones are invalid

    """
    type = DateTime
Run Code Online (Sandbox Code Playgroud)

使用如下:

from sqlalchemy import select, func
print select([func.convert_tz(func.now(), '+00:00', '-05:00')])
Run Code Online (Sandbox Code Playgroud)

它将生成以下SQL:

SELECT convert_tz(now(), :param_1, :param_2) AS convert_tz_1
Run Code Online (Sandbox Code Playgroud)