【问题标题】:Unable to query using session.execute for MySQL无法使用 MySQL 的 session.execute 进行查询
【发布时间】:2017-05-28 20:45:05
【问题描述】:

我正在使用烧瓶 sqlalchemy。但是在命令行调试的时候发现session.execute返回错误。

Stock ='SHELL'
>>> db.session.execute("SELECT * FROM KJ WHERE Stock LIKE %s",(Stock,))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/orm/scoping.py", line 149, in do
        return getattr(self.registry(), name)(*args, **kwargs)
      File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/orm/session.py", line 978, in execute
        clause, params or {})
      File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/engine/base.py", line 720, in execute
        return meth(self, multiparams, params)
      File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/sql/elements.py", line 317, in _execute_on_connection
        return connection._execute_clauseelement(self, multiparams, params)
      File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/engine/base.py", line 793, in _execute_clauseelement
        keys = distilled_params[0].keys()
    AttributeError: 'tuple' object has no attribute 'keys'

如果我使用 db.engine.execute,它可以正常工作,没有错误

db.engine.execute("SELECT * FROM KLSE WHERE Stock LIKE %s",(Stock,))

另外,如果我导入 mysqldb,使用游标执行,它也可以正常工作。

curs.execute("SELECT * FROM KJ WHERE Stock LIKE %s",(Stock,))

我怀疑的问题是 %s 与 session.execute 的 Stock 不匹配。看了sqlalchemy文档,没看懂。

执行(子句,params=None,mapper=None,bind=None,**kw)¶ http://docs.sqlalchemy.org/en/latest/orm/session_api.html

【问题讨论】:

  • 你试过去掉你选择的多余的逗号吗? WHERE Stock LIKE %s",(Stock,)) -> WHERE Stock LIKE %s",(Stock))
  • 是的,没有出现同样的错误

标签: python mysql session flask-sqlalchemy


【解决方案1】:

来自文档:

execute 使用 SELECT 的格式如下:

execute(clause, params=None, mapper=None, bind=None, **kw)

文档中有一个使用以下选择的示例解决方案:

result = session.execute(
        "SELECT * FROM user WHERE id=:param",
        {"param":5}
    )

如果您的数据库连接设置正确,按照文档,以下应该可以工作:

Stock ='SHELL'
db.engine.execute(text("SELECT * FROM KLSE WHERE Stock LIKE :param"),{"param":Stock})

这个想法是您将查询提供给text() 函数,它是execute() 的有效参数。这样,您就可以执行任何本机不能作为 SQLalchemy 函数使用的任意 SQL。 IE。子句参数接受可执行语句(SQLalchemy函数或其他可执行函数,必须使用text()传递任意字符串,参数以字典形式给出。

【讨论】:

  • W,谢谢。如果Stock =['SHELL',EXXON']placeholders = ','.join([':param'] * len(Stock)),如何在db.session.execute 中放置多个占位符?
  • 其实db.session.execute("SELECT * FROM KLSE WHERE Stock LIKE :param"),{"param":Stock})有效
  • 所以我的回答确实解决了你的问题?还是还有什么不清楚的地方?
  • 解决一个库存问题。如果 Stock 是一个以上的列表,我需要放置占位符。 db.session.execute("SELECT * FROM KLSE WHERE Stockbalance IN :placeholders"),{placeholders:Stock}) 返回无效语法
  • 嗯,是的,因为您使用的是LIKE。如果要搜索多个对象,则需要使用 IN :paramLIKE :param OR LIKE :param2。也就是说,我相信我的回答确实涵盖了您最初的问题。
猜你喜欢
  • 2013-03-11
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 2013-07-09
  • 1970-01-01
  • 2020-09-04
相关资源
最近更新 更多