【问题标题】:Why does the query return a number instead of the row values?为什么查询返回一个数字而不是行值?
【发布时间】:2021-11-22 15:46:23
【问题描述】:

为什么cursor.fetchone() 返回{'1': 1} 而不是行值?

我期待像 {'username': 'Bob', 'password': 'hunter2'} 这样的东西。

from flaskext.mysql import MySQL
from pymysql.cursors import DictCursor
# ...
mysql = MySQL(cursorclass=DictCursor)
# ...
cursor = mysql.get_db().cursor()
# ...
cursor.execute('SELECT 1 FROM users WHERE username = %s AND password = %s', [name, password])
row = cursor.fetchone()
print(row) # {'1': 1}

【问题讨论】:

  • 它正在返回行值。该行名为"1",值为1,因为您的select 语句为SELECT 1。你还期待什么?
  • 我期待像(Bob, hunter2) 这样的东西,因为那是行的值。 SELECT 1 我打算只从表中获取 1 行而不是多行。
  • 你为什么写cursorclass=DictCursor? (编辑:没关系,但也许你应该澄清你的问题不是关于为什么结果是字典而不是元组)
  • SELECT 1 不是这个意思。我想你正在寻找SELECT ... LIMIT 1

标签: python mysql sql


【解决方案1】:

您正在选择一个名为 1 的列(因为它是所选常量“列”的隐含名称),其值为 1。

如果你使用SELECT 2 FROM ...,你会得到{"2": 2}

如果没有与 FROM 匹配的行,您将得到 None(而 cursor.rowcount 将为零)。

我期待像 (Bob, hunter2) 这样的东西,因为那是行的值。

那么你需要SELECT username, password,而不是SELECT 1。然后你会得到一个字典{"username": "Bob", "password": "hunter2"}

...而不是表格中的多行

通过您的查询,如果有多行包含 WHERE 用户名和密码,您将获得多行 {"1": 1}。如果您只想要第一个匹配行,请添加 LIMIT 1

【讨论】:

    【解决方案2】:

    不是从表中选择列,而是选择文字值,即 1。因此 MySQL 必须为该值分配一个列名,并使用与列值相同的字符串。在这种情况下,这将是“1”。

    您可以使用 AS 显式分配列名:

    SELECT 1 AS some_name …
    

    看起来 SELECT 语句正在通过查看是否返回一行来验证用户 ID/密码组合,该行仅在用户 ID 和密码匹配时才会出现。返回的行的内容并不重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 2022-12-11
      • 1970-01-01
      • 2012-11-28
      • 2020-04-16
      • 1970-01-01
      相关资源
      最近更新 更多