【问题标题】:SQLAlchemy parameter binding notSQLAlchemy 参数绑定不
【发布时间】: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


    【解决方案1】:

    就在发布之前,我找到了解决方案,使用文本来包装查询,这样:

    result = engine.execute(sql, **vals)
    

    变成这样:

    from sqlalchemy.sql import text
    result = engine.execute(text(sql), **vals)
    

    希望带有错误消息的内容能帮助某人找到此解决方案!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      • 2018-09-28
      • 2023-03-18
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多