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查询报错的主要内容,如果未能解决你的问题,请参考以下文章

flask-SQLAlchemy怎么查询具体字段

flask-SQLAlchemy怎么查询具体字段

Flask SQL性能测试:使用flask-sqlalchemy检测慢SQL语句

在 Flask-SQLAlchemy 中联表查询

flask SQLAlchemy

Flask-SQLAlchemy操作