繁体   English   中英

将SQL语句转换为等效的SQLAlchemy

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM