让Sqlalchemy在Postgresql中过滤使用日期

30 投票
4 回答
29447 浏览
提问于 2025-04-16 23:40

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

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

我尝试了几种方法,包括一些在StackOverflow上的方法。但是没有一种方法看起来“现实”,因为有些方法会进行类型转换或者其他字符串格式化,而不是直接在ORM字段中使用简单的日期(这里的日期是指Postgresql的日期,而不是Python的日期)

在ORM层面上,是否可以在查询的字段周围声明一个简单的Date()

4 个回答

1

在PostgreSQL数据库中,如果你的表里有一个叫做date_time_field的字段,那么查询的写法应该是这样的: 从Mytable表中选择所有记录,条件是date_time_field等于'2011-08-16'。

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
64

为了让任何网络搜索都能保持整洁。

from sqlalchemy import Date, cast
from datetime import date

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

撰写回答