将SQL语句转换为等效的SQLAlchemy

时间:2015-02-20 10:19:59

标签: mysql sql 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

但它说语法无效。请帮忙。谢谢和问候:)

2 个答案:

答案 0 :(得分:1)

我建议您正在寻找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)

答案 1 :(得分: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()