【发布时间】:2014-05-26 22:29:16
【问题描述】:
我正在尝试使用 SQLAlchemy 对一些原始 SQL 进行一些查询绑定(由于复杂性),但它似乎没有正确绑定命名参数。运行以下代码时出现错误,如果我手动编辑 SQL 字符串以使用设置值,该代码可以正常工作:
engine = create_engine('mysql://scott:tiger@localhost/foo')
vals = {
'tag_id': 1,
'interval': 300,
'start_time': datetime.datetime(2014, 5, 1, 0, 0),
'end_time': datetime.datetime(2014, 6, 1, 0, 0)
}
sql = """SELECT
FROM_UNIXTIME( CEIL( UNIX_TIMESTAMP( event_time ) / :interval ) * :interval ) AS pseudo_time,
AVG( value ) AS average_value
FROM `data_point_double`
WHERE
(tag_id = :tag_id) AND
(event_time BETWEEN :start_time AND :end_time)
GROUP BY CEIL( UNIX_TIMESTAMP( event_time ) / :interval ), tag_id"""
result = engine.execute(sql, **vals)
这会导致以下错误:
sqlalchemy.exc.ProgrammingError: (ProgrammingError) (1064, "您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以获取在 ':interval 附近使用的正确语法) * :interval )作为伪时间,...
日志似乎表明正在传递参数:
2014-05-26 23:23:55,506 INFO sqlalchemy.engine.base.Engine SELECT
FROM_UNIXTIME( CEIL( UNIX_TIMESTAMP( event_time ) / :interval ) * :interval ) AS pseudo_time,
AVG( value ) AS average_value
FROM `data_point_double`
WHERE
(tag_id = :tag_id) AND
(event_time BETWEEN :start_time AND :end_time)
GROUP BY CEIL( UNIX_TIMESTAMP( event_time ) / :interval ), tag_id
2014-05-26 23:23:55,506 INFO sqlalchemy.engine.base.Engine {'start_time': datetime.datetime(2014, 5, 1, 0, 0), 'interval': 300, 'end_time': datetime.datetime(2014, 6, 1, 0, 0), 'tag_id': 1L}
2014-05-26 23:23:55,506 INFO sqlalchemy.engine.base.Engine ROLLBACK
我是在正确使用命名参数还是这是一个更大的问题?我也试过 mysql+mysqldb 作为引擎,但也没有用。
【问题讨论】:
标签: python mysql sqlalchemy