【问题标题】:Why pymysql cursor.execute() gets different results?为什么 pymysql cursor.execute() 得到不同的结果?
【发布时间】:2018-09-06 15:04:33
【问题描述】:

在我的烧瓶应用程序(Flask 0.12.2,Python 3.6.2)中,我想从 MySQL 数据库中选择行。 这是我的导入:

from flask import Flask, jsonify
from flaskext.mysql import MySQL

还有一些初始化:

app = Flask(__name__)
app.config['MYSQL_DATABASE_PORT'] = 3306 
app.config['MYSQL_DATABASE_USER'] = '...'
app.config['MYSQL_DATABASE_PASSWORD'] = '...'
app.config['MYSQL_DATABASE_DB'] = '...'
app.config['MYSQL_DATABASE_HOST'] = 'localhost'
mysql = MySQL()
mysql.init_app(app)
con = mysql.connect()

顺便说一下,我的桌子是这样的:

================================

标识 |姓名 |年龄

1 | “约翰” | 20

================================

所以现在我要编写一个以“column_name”和“id”为参数的函数:

@app.route('/test/<device_id>/<column_name>', methods=['GET'])
def test(column_name, device_id):
    sql = "SELECT %s FROM `table` WHERE `id` = %s"
    cursor = con.cursor()
    result_row = cursor.execute(sql, (column_name, device_id))
    query_result = cursor.fetchall()
    cursor.close()
    return jsonify({'result': query_result})

我希望如果我向 /test/1/name 提出请求 我会得到一个 JSON 对象:

{"result": ["John"]}

但是,我得到的是列名而不是列数据:

{"result": ["name"]}

我想知道是不是我的sql有问题,所以我使用了一个新的sql:

sql = "SELECT `name` FROM `table` WHERE `id` = 1"
result_row = cursor.execute(sql)

这一次它可以使用这个纯 sql,但是它失去了接收参数的能力。

所以我想知道我之前的代码sn-p中我的sql有什么问题?还是我搞砸了 execute() 方法?

【问题讨论】:

  • 对DB不太了解,但我在代码片段中看到了1和“1”的区别。你可以试试:@app.route('/test/&lt;int:device_id&gt;/&lt;column_name&gt;', ... 吗?(在 id 中添加了int:
  • 我试过了,但得到了相同的结果。最奇怪的是我为 url 指定的任何奇怪的 (例如 /test/1/asdfasdf),我仍然可以获得 {"result": ["asdfasdf"]} 的 JSON 结果。所以看来sql字符串在这里不起作用...

标签: python pymysql


【解决方案1】:

你得到结果“name”,因为真正运行的sql是:

SELECT "name" FROM `table` WHERE `id` = 1

注意“名称”,而不是“名称”

你可以像这样得到你想要的结果:

sql = "SELECT * FROM `table` WHERE `id` = %s"
cursor = con.cursor()
result_row = cursor.execute(sql, (device_id))
query_result = cursor.fetchall()
for row in query_result:
  print row[column_name]

【讨论】:

  • 我认为您需要在 cursor.execute (device_id,) 中添加一个元组
  • 是的,这可能是一个解决方案。但我想知道是否真的没有办法让列名成为参数。顺便说一句,我的 query_result 是元组 ((1, "John", 20),) 的元组,而不是字典的元组,所以我不能像 row['name'] 那样访问它。是因为版本不同吗?
  • 也许...你可以根据这个答案得到你的结果 [stackoverflow.com/questions/10195139/… 像这样:# 获取字段名称(仅一次!) field_name = [field[0] for field in cursor .description] # 使用 fetchone() 方法获取单行。 values = cursor.fetchone() # 创建行字典以便能够调用 row['login'] row = dict(zip(field_name, values)) # 打印字典 print(row)
  • 我的cursor.description 得到了None。但我想我已经从您的链接中找到了解决方案。我所要做的就是这样:cursor = con.cursor(pymysql.cursors.DictCursor) 然后query_result 的结果将是一个字典列表。
猜你喜欢
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多