使用Postgresql让Sqlalchemy在筛选中使用日期

31

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

Select * from "Mytable" where Date(date_time_field) = "2011-08-16";

我尝试了几种方法,一些是从stackoverflow上找到的。 但是似乎没有一种方法是“实际可行的”,因为有些方法要进行强制类型转换和其他字符串格式化?!?!而不是在ORM字段上使用简单的Date() (按照我的意思是指Postgresql日期而不是Python的日期)

在ORM级别上是否可能在查询的字段周围声明一个简单的Date()

4个回答

65
为了让任何网页搜索都更加干净。
from sqlalchemy import Date, cast
from datetime import date

my_data = session.query(MyObject).\
filter(cast(MyObject.date_time,Date) == date.today()).all()

5
根据我的经验,如果你在SQLite中进行测试,使用func.date会更好,因为cast无法使用。 - Halvor Holsten Strand

28

可以使用func模块调用本地SQL函数。

from sqlalchemy import func
from datetime import date

my_data = session.query(MyObject).filter(
    func.date(MyObject.date_time) == date.today()
).all()

调用func.date

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

将会产生以下SQL语句:

 SELECT date(:date_2) AS date_1

您还可以声明自己的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

使用方法:

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

它将生成以下SQL:

SELECT convert_tz(now(), :param_1, :param_2) AS convert_tz_1

此帖子因过于简短/仅包含代码而被自动标记为低质量。您能否通过添加一些解释性文本来扩展它,以说明它如何解决问题? - gung - Reinstate Monica
我添加了解释和文档参考。 - Zuzia Hartleb

1

如果date_time_field是您的表中的一个字段,则在postgreSQL中查询必须像这样。 选择*从Mytable where date_time_field ='2011-08-16'


你好,更确切地说,这个字段是没有时区的时间戳 :) - PythonWolf
简单的方法是将其转换为日期,选择* from mytable where cast(date_time_field as date)='2011-08-16'; 在pgsql中进行投射的速记法是::方法,如下所示:select * from mytable where date_time_field :: date ='2011-08-16'; 但这不是SQL规范标准,也不会是可移植的。如果您不需要可移植性,则::方法看起来更清晰,记忆语法也更容易。但是,使用date(date_time_field)的方法也应该可以正常工作。 - Scott Marlowe
你好 Scott,谢谢。现在的问题是将它移植到Sqlalchemy中,我今天会尝试一下 :) - PythonWolf
1
简单:cast(MyObj.date_time_field,Date)== date.today() - Ants Aasma

1
这里有一些通用解决方案,也适用于SQLite:
day = date.today()
next_day = day + timedelta(days=1)
my_data = session.query(MyObject).filter(MyObject.date_time >= day,  MyObject.date_time < next_day).all()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接