[英]Converting SQL statement to equivalent SQLAlchemy
我有以下SQL查询(MySQL数据库)
SELECT distinct filename, DATE(created)
FROM FileTable
WHERE created > DATE_SUB(NOW(), INTERVAL 7 DAY);
我的表定义:
**FileTable**
id : PK
filename :varchar
created :date
如何为上述SQL语句编写等效的SQLAlchemy查询并获取结果?
我试过了
myvar=session.query(FileTable).filter(created > DATE_SUB(NOW(), INTERVAL 7 DAY)).first()
return x.filename,x.DATE(created) for x in myvar
但是它说语法无效。 请帮忙。 谢谢并恭祝安康 :)
我建议您正在寻找sqlalchemy.sql.functions
魔术func
。 这是一个例子:
from sqlalchemy import *
metadata = MetaData()
FileTable = Table(
'FileTable',
metadata,
Column('id', Integer, primary_key=True),
Column('filename', String),
Column('created', DateTime))
print select([
distinct(FileTable.columns.filename),
func.date(FileTable.columns.created)
]).where(
FileTable.columns.created > func.date_sub(func.now(), 7))
# Output:
# SELECT DISTINCT "FileTable".filename, date("FileTable".created) AS date_1
# FROM "FileTable"
# WHERE "FileTable".created > date_sub(now(), :date_sub_1)
您可以尝试这样做,但可能导致这些文件名的行在每个日期都是不同的(我已经在PostgreSQL中测试过)。
query = session.query(FileTable.filename.distinct(),
func.date(FileTable.created))\
.filter(created > func.adddate(func.now(), -7))
return query.all()
如果发现自己只希望每个文件名仅检索一行,则可以将查询转换为获取文件名及其(例如)最新创建时间,如下所示:
query = session.query(FileTable.filename,
func.date(func.max(FileTable.created)))\
.filter(created > func.adddate(func.now(), -7))\
.group_by(FileTable.filename)
return query.all()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.