【问题标题】:tuple indices must be integers or slices, not str元组索引必须是整数或切片,而不是 str
【发布时间】:2018-03-12 14:52:26
【问题描述】:

我在使用 mySQL 时遇到了这个问题。我的结果 = [{'email': 'bernie@shrimp.com'}] 但是当我在做 email = results[0]['email'] 时我得到一个 TypeError: tuple indices must be integers or slices, not str

问题是当我在本地运行它时,它运行良好。如何获得bernie@shrimp.com

users 是一张表

代码:

cursor.execute('SELECT email FROM users WHERE username = %s', [attempted_username])
email_dict = cursor.fetchall()
print(email_dict)
session['email'] = email_dict[0]['email']

控制台:

[{'email': 'bernie@shrimp.com'}]

【问题讨论】:

  • 由于您的变量名称不匹配,您可以使用正确的代码编辑问题。比如我的结果和结果。
  • 我在上面添加了一些 - 告诉我是否需要更多
  • 无论有没有会话,问题都会出现
  • 您的控制台输出令人困惑,您可以检查一下它的 [{}] 还是 [()]
  • 我复制并粘贴了@Harry

标签: python mysql pythonanywhere


【解决方案1】:

fetchall 的结果是一个元组列表,而不是 dict 的列表。

您的查询结果只有一个字段:索引为 0 的电子邮件。

你可以这样重写你的代码:

rows = cursor.fetchall()
for row in rows:
    email = row[0]

或者,在您只有一个结果的情况下:

session['email'] = rows[0][0]

我想,你也可以使用:

row = cursor.one()

【讨论】:

  • 那我如何获得bernie@shrimp.com?
  • 不会 row[0] 将返回 'email' 而不是 'bernie@shrimp.com'
  • @Harry 不,row 是包含字段值tuple,而不是dict
  • 哦,对不起,他的控制台输出让我感到困惑。
【解决方案2】:

fetchall 返回一个元组列表。您需要通过列的序号而不是其名称来访问它:

session['email'] = email_dict[0][0]

【讨论】:

    【解决方案3】:

    这可以与 extras.DictCursor 一起使用:

    cur = conn.cursor(cursor_factory = psycopg2.extras.DictCursor)
    for fields in cur:
       print(fields['column_name'])
    

    【讨论】:

      猜你喜欢
      • 2017-03-11
      • 2019-11-23
      • 2018-12-29
      • 2021-09-08
      • 2021-01-18
      • 1970-01-01
      • 2016-05-25
      • 2021-09-13
      • 1970-01-01
      相关资源
      最近更新 更多