让Sqlalchemy在Postgresql中过滤使用日期
我正在尝试在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()