flask sqlalchemy 执行sql查询报错
Posted
技术标签:
【中文标题】flask sqlalchemy 执行sql查询报错【英文标题】:flask sqlalchemy execute sql query error 【发布时间】:2018-01-16 01:20:30 【问题描述】:你能帮我解决这个错误吗请:
2017-08-05 18:54:18,421 信息 sqlalchemy.engine.base.Engine (4L,) 2017-08-05 18:54:18,424 信息 sqlalchemy.engine.base.Engine COMMIT 127.0.0.1 - - [ 2017 年 8 月 5 日 18:54:18]“GET / HTTP/1.1”200 - 127.0.0.1 - - [2017 年 8 月 5 日 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 /aloui/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 光标中= 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/P rojetHandy/venv-handy/lib/python2.7/site-packages/sqlalchemy/orm/session.py”,第 1101 行,在执行子句 = expression._literal_as_text(clause) 文件“/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
model.py:
@staticmethod
def find_users(query):
search_job = str(query)
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 = %s
""", [search_job]
cursor = db.session.execute(sql )
# Returns a list of product tuples
return cursor.fetchall()
views.py:
@auth.route('/search' )
def search_user():
search_query = request.args.get('query')
users = User.find_users(search_query)
return render_template("home/search_results.html",
query=search_query,
users=users)
home.html:
<form class="navbar-form navbar-left" action="url_for('auth.search_user') ">
<div class="form-group">
<input type="text" class="form-control" name="query" placeholder="Search">
<input type="hidden" name="index" value="All">
</div>
<button type="submit" class="btn btn-default">Search</button>
</form>
这就是我用来执行这个请求的所有代码,你知道吗? 谢谢。
注意:当我在我的模型函数中给出一个值时,它会起作用。
jobs.description = %s -with->jobs.description = "值"
【问题讨论】:
尝试将 [search_job] 替换为 search_job。你能简单地检查一下吗? 不幸的是@vishesshell 删除了他们的答案,但问题的根本原因是您将tuple
传递给execute()
。而是将 SQL 字符串和参数作为单独的参数传递。仔细阅读Using Textual SQL。 SQLAlchemy 为您提供了一个与 DB-API 驱动程序无关的命名占位符处理(而不是例如 %s
占位符)。您走在正确的道路上,因为您没有使用字符串格式来形成查询。
Nabin:我在发这篇文章之前测试了它,但它不起作用。我不知道为什么 vishesshell 删除了他的答案,我没有测试它:(。@IljaEverilä 我会测试它并给你一个答案,我现在不在家,谢谢。
那就是我,我批评了答案的某些方面——有点严厉。即第一个使用字符串格式将值内联到查询字符串的示例,这几乎总是错误的方法。
除了上一个链接,你当然也应该阅读Session.execute()
上的文档。
【参考方案1】:
这是我在 models.py 中的解决方案,它有效 :)
@staticmethod
def find_handymans(query):
search_job = str(query)
sql_query =text("SELECT first_name,last_name, email, user_type, phone, image, diplome, latitude, longitude, description FROM users, jobs WHERE users.id_job = jobs.id AND jobs.description = :x ")
cursor = db.session.execute(sql_query,'x' : search_job)
# Returns a list of product tuples
return cursor.fetchall()
【讨论】:
以上是关于flask sqlalchemy 执行sql查询报错的主要内容,如果未能解决你的问题,请参考以下文章