将 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);

我的table定义:

**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()