【问题标题】:Why MySql connection not working on Flask Python API为什么 MySql 连接在 Flask Python API 上不起作用
【发布时间】:2021-04-05 16:02:20
【问题描述】:

我使用的是 sqlite,但后来转移到了 MySqL

有效的 Sqlite 代码:

@app.route('/api/v1/users/user', methods=['GET'])
def api_filter():
    query_parameters = request.args
userid = query_parameters.get('userid')
username = query_parameters.get('username')

query = "SELECT * FROM tblUser WHERE"
to_filter = []

if userid:
    query += ' user_id=? AND'
    to_filter.append(userid)
if username:
    query += ' username=? AND'
    to_filter.append(username)
if not (userid or username):
    return page_not_found(404)

query = query[:-4] + ';'

conn = sqlite3.connect('dbApp.db')
conn.row_factory = dict_factory
cur = conn.cursor()

results = cur.execute(query, to_filter).fetchall()

return jsonify(results)

现在当我将它更改为 MySQL 时,它不起作用:

@app.route('/api/v1/users/user', methods=['GET'])
def api_filter():
    query_parameters = request.args
userid = query_parameters.get('userid')
username = query_parameters.get('username')

query = "SELECT * FROM tblUser WHERE"
to_filter = []

if userid:
    query += ' user_id=? AND'
    to_filter.append(userid)
if username:
    query += ' username=? AND'
    to_filter.append(username)
if not (userid or username):
    return page_not_found(404)

query = query[:-4] + ';'

conn = mysql.connector.connect(host="localhost", user="root", password="green", database="dbApp")
conn.row_factory = dict_factory
cur = conn.cursor()

results = cur.execute(query, to_filter).fetchall()

return jsonify(results)

返回的错误: 结果 = cur.execute(query, to_filter).fetchall() 文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/mysql/connector/cursor_cext.py”,第260行,在执行 引发错误。ProgrammingError( mysql.connector.errors.ProgrammingError: SQL 语句中没有使用所有参数 127.0.0.1 - - [28/Dec/2020 17:47:11] "

这是运行后: http://127.0.0.1:5000/api/v1/users/user?userid=3&username=Jo

http://127.0.0.1:5000/api/v1/users/user?userid=3

http://127.0.0.1:5000/api/v1/users/user?username=Jo

还添加了这个: 来自烧瓶导入请求,jsonify 导入mysql.connector

【问题讨论】:

  • 您在上面泄露了您的凭据。当您使用 mysql cli 登录时它们是否有效?
  • 嗨@AllanWind,是的,我可以确认我可以,将它们放在另一个应用程序中并且工作正常,所以我摸不着头脑
  • 第 260 行是什么?
  • @AllanWind 结果 = cur.execute(query, to_filter).fetchall()
  • 它需要一个元组,然后你向它发送一个数组。

标签: python mysql flask-restful


【解决方案1】:

documentation 是这样说的:

cursor.execute(操作,params=None,multi=False) 此方法执行给定的数据库操作(查询或命令)。 在元组或字典参数中找到的参数绑定到 操作中的变量。使用 %s 或 %(name)s 指定变量 参数样式(即使用 format 或 pyformat 样式)。执行() 如果 multi 为 True,则返回一个迭代器。

我认为您的代码存在两个问题:您使用的是 ?用于绑定变量而不是 %s,并且您传入的是列表而不是元组。或者使用命名参数并使用 dict 传入值。两者都试一下,看看你最喜欢什么。

  1. user_id = %s"to_filter = (userid, )。您可以使用现有的列表并将其转换为 tuple()
  2. " user_id = %{user_id}" 并设置to_filter = {'user_id': userid }

先建立一个条件列表,然后是'AND'.join(conditions),而不是删除额外的AND,这样更简洁。您可以通过省略 ';' 来稍微简化代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 2021-08-30
    • 2020-12-14
    • 1970-01-01
    • 2015-05-16
    • 2020-06-02
    相关资源
    最近更新 更多