Python 无法使用session.execute for MySQL进行查询
我在用炼金术。然而,当在命令行中调试时,我发现Python 无法使用session.execute for MySQL进行查询,python,mysql,session,flask-sqlalchemy,Python,Mysql,Session,Flask 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/l
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'
另外,如果我使用游标execute导入mysqldb,它也可以正常工作
curs.execute("SELECT * FROM KJ WHERE Stock LIKE %s",(Stock,))
我怀疑的问题是%s与会话的库存不匹配。请执行。我浏览了sqlalchemy文档,但不理解
执行(子句,params=None,mapper=None,bind=None,**kw)
从文档中:
使用SELECT forexecute
的格式如下:
execute(子句,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。也就是说,子句参数接受可执行语句(SQLalchemy函数或其他可执行函数,任意字符串必须与text()
一起传递,参数作为字典提供。来自文档:
使用SELECT forexecute
的格式如下:
execute(子句,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。即,子句参数接受可执行语句(SQLalchemy函数或其他可执行函数,任意字符串必须与text()
一起传递,参数以字典形式给出。您是否尝试在选择中去掉多余的逗号?WHERE Stock LIKE%s',(Stock,)
->WHERE Stock LIKE%s',(Stock))
是,不处理相同的错误您是否尝试过在选择中去掉多余的逗号?如%s”的股票,(股票,)
->如%s”的股票,(股票))
是,不处理相同的错误,谢谢。如果Stock=['SHELL',EXXON']
和placeholder=','.join([':param']*len(Stock))
,我如何在db.session.execute
?实际上db.session.execute(“SELECT*FROM KLSE WHERE Stock-LIKE:param”),{“param”:Stock}
工作,那么我的答案解决了你的问题?还是还有什么不清楚的地方?一只股票就可以解决问题。若股票是一个不止一个的列表,我需要放置占位符db.session.execute(“SELECT*FROM KLSE WHERE Stockbalance IN:placeholders”),{placeholders:Stock})
返回无效的syntaxWell yes,因为您使用的是类似于
的。如果要搜索多个对象,则需要在:param
中使用,或者使用LIKE:param或LIKE:param2
。也就是说,我相信我的回答涵盖了你原来的问题。W,谢谢。如果Stock=['SHELL',EXXON']
和placeholder=','.join([':param']*len(Stock))
,我如何在db.session.execute
?实际上db.session.execute(“SELECT*FROM KLSE WHERE Stock-LIKE:param”),{“param”:Stock}
工作,那么我的答案解决了你的问题?还是还有什么不清楚的地方?一只股票就可以解决问题。若股票是一个不止一个的列表,我需要放置占位符db.session.execute(“SELECT*FROM KLSE WHERE Stockbalance IN:placeholders”),{placeholders:Stock})
返回无效的syntaxWell yes,因为您使用的是类似于
的。如果要搜索多个对象,则需要在:param
中使用,或者使用LIKE:param或LIKE:param2
。尽管如此,我相信我的回答确实涵盖了你最初的问题。