烧瓶使用 where 表达式执行 mysql 查询
Posted
技术标签:
【中文标题】烧瓶使用 where 表达式执行 mysql 查询【英文标题】:flask execute mysql query with where expression 【发布时间】:2018-01-13 09:32:41 【问题描述】:我使用这个函数来运行一个 SQL 查询:
@staticmethod
def find_users(query):
search_job = query
# search_formatted = ' & '.join(words)
sql = ("""SELECT first_name,last_name, email, phone, image, diplome, latitude, longitude, description
FROM users, jobs
WHERE users.id_job = jobs.id
AND jobs.description = ?
""", [search_job])
cursor = db.session.execute(sql)
# 'search_terms': search_job)
# Returns a list of product tuples
return cursor.fetchall()
但我得到了这个错误
2017-08-05 18:54:18,421 信息 sqlalchemy.engine.base.Engine (4L,) 2017-08-05 18:54:18,424 信息 sqlalchemy.engine.base.Engine 提交 127.0.0.1 - - [2017 年 8 月 5 日 18:54:18] “GET / HTTP/1.1” 200 - 127.0.0.1 - - [05/Aug/2017 18:54:19] “GET /static/img/markers_shadow.png HTTP/1.1”404 - 127.0.0.1 - - [05/Aug/2017 18:54:19] “GET /static/fonts/glyphicons-halflings-regular.woff2 HTTP/1.1”404 - 127.0.0.1 - - [05/Aug/2017 18:54:19] “GET /static/fonts/glyphicons-halflings-regular.woff HTTP/1.1”404 - 127.0.0.1 - - [05/Aug/2017 18:54:19] “GET /static/fonts/glyphicons-halflings-regular.ttf HTTP/1.1”404 - [2017-08-05 18:54:23,162] 应用程序中的错误:/auth/search 异常 [GET] Traceback(最近一次调用最后一次):文件 "/home/alaoui/Documents/ProjetHandy/venv-handy/lib/python2.7/site-packages/flask/app.py", 第 1988 行,在 wsgi_app 中 响应 = self.full_dispatch_request() 文件“/home/alaoui/Documents/ProjetHandy/venv-handy/lib/python2.7/site-packages/flask/app.py”, 第 1641 行,在 full_dispatch_request 中 rv = self.handle_user_exception(e) 文件“/home/alaoui/Documents/ProjetHandy/venv-handy/lib/python2.7/site-packages/flask/app.py”, 第 1544 行,在 handle_user_exception 中 reraise(exc_type,exc_value,tb)文件“/home/alaoui/Documents/ProjetHandy/venv-handy/lib/python2.7/site-packages/flask/app.py”, 第 1639 行,在 full_dispatch_request 中 rv = self.dispatch_request() 文件“/home/alaoui/Documents/ProjetHandy/venv-handy/lib/python2.7/site-packages/flask/app.py”, 第 1625 行,在 dispatch_request 中 返回 self.view_functionsrule.endpoint 文件“/home/alaoui/Documents/ProjetHandy/handy_2/app/auth/views.py”,行 194,在 search_handyman handymans = User.find_handymans(search_query) 文件“/home/alaoui/Documents/ProjetHandy/handy_2/app/models.py”,第 88 行, 在 find_handymans cursor = db.session.execute(sql) 文件“/home/alaoui/Documents/ProjetHandy/venv-handy/lib/python2.7/site-packages/sqlalchemy/orm/scoping.py”, 第 157 行,在做 返回 getattr(self.registry(), name)(*args, **kwargs) 文件 "/home/alaoui/Documents/ProjetHandy/venv-handy/lib/python2.7/site-packages/sqlalchemy/orm/session. py", 第 1101 行,在执行中 子句=表达式._literal_as_text(子句)文件“/home/alaoui/Documents/ProjetHandy/venv-handy/lib/python2.7/site-packages/sqlalchemy/sql/elements.py”, 第 4238 行,在 _literal_as_text 中 "instead" % type(element) ArgumentError: SQL expression object or string expected, got object of type instead
【问题讨论】:
您是否运行过调试器并验证search_job
是否正确?
从终端添加完整的错误堆栈跟踪
【参考方案1】:
如果您查看execute
的签名,您会发现:
execute(clause, params=None, mapper=None, bind=None, **kw)
然后,查看doc,您会发现:
参数:
clause – 要执行的可执行语句(即可执行表达式,例如 expression.select())或字符串 SQL 语句。
params – 可选字典或字典列表,包含绑定的参数值。如果是单个字典,则发生单行执行;如果是字典列表,将调用“executemany”。每个字典中的键必须与语句中存在的参数名称相对应。
mapper – 可选的 mapper() 或映射类,用于标识适当的绑定。定位绑定时,此参数优先于子句。有关详细信息,请参阅 Session.get_bind()。
bind – 用作绑定的可选引擎。如果此引擎已参与正在进行的事务,则将使用该连接。定位绑定时,此参数优先于映射器和子句。
**kw – 额外的关键字参数被发送到 Session.get_bind() 以允许“绑定”方案的可扩展性。
使用调试器单步执行您的代码,并查看您实际传递的内容作为针对该签名的参数。你会发现你的第二个参数 [search_job]
不满足任何预期的参数,因此你得到 p>
ArgumentError: 需要 SQL 表达式对象或字符串,而是得到类型的对象
【讨论】:
您有什么建议可以更正代码吗? 可能。但我无法调试您的代码。请检查该行并告诉我们有关“search_job”的信息。阅读minimal reproducible example 以帮助我们帮助您。 'search_job' 只是简单的输入字符串字段,它包含一个单词。以上是关于烧瓶使用 where 表达式执行 mysql 查询的主要内容,如果未能解决你的问题,请参考以下文章