【问题标题】:Can't access index of a tuple. IndexError: list index out of range无法访问元组的索引。 IndexError:列表索引超出范围
【发布时间】:2020-01-10 16:30:47
【问题描述】:

我在 python 中使用 sqlite3 创建了一个数据库,然后添加了一个包含 5 个参数的表。我在表格中添加了一个条目,填充了所有 5 个参数。我正在尝试选择具有特定参数“用户”的所有条目。

如果我打印没有索引的选定元组,它会返回一个包含 5 个参数的元组如预期的那样

如果我打印索引为 [0] 的元组,它会返回一个包含 5 个参数的元组而不仅仅是第一个参数。

如果我打印索引高于 [0] 的条目,例如 [1],它会返回 IndexError: list index out of range。

我想访问所有索引,但除了我尝试过的方法之外,我不知道该怎么做。

下面的代码:(financedb 是我的另一个 .py 文件,其中包含一个函数 db_connect() 连接到数据库。我在下面的代码中包含了该函数,以便更容易复制代码。)

import sqlite3
import financedb as fdb

user_name_input = input('Username: ')


def check_the_balance():

    fdb.db_connect() # Establishes connection to DB

    fdb.cursor.execute('SELECT * FROM test WHERE user=?', [user_name_input])
    check = fdb.cursor.fetchall()
    print(check[0])

def db_connect():

    global connection 
    global cursor 

    cursor = connection.cursor()
    command = f'CREATE TABLE test(id integer, user text, password text, montly_income real, monthly_debt real)'

    try:
        cursor.execute(command)

    except sqlite3.OperationalError:
        pass

    finally:
        connection.commit()
check_the_balance()  

【问题讨论】:

  • 你确定你的查询返回了一些东西,即有user等于参数user_name_input的记录吗?
  • @GMB 简单的答案 - 是的。更长的答案 - 在user_name_input 之后,如果我查询数据库中的用户,我会收到分配给该用户的 5 个参数的整行。这包括特定的 ID、用户、密码和其他两个 FLOATS。
  • 一个好的做法是明确地写出你想要选择的字段(如果是这样的话,甚至是所有的字段)。如果您移动一列、在中间添加一列或删除一列,这将强制执行顺序并防止您的代码中断

标签: python sqlite tuples


【解决方案1】:

.fetchall 返回一个行列表,所以我假设你想要check[0][0]?这可能会给你你想要的:

def check_the_balance():

    fdb.db_connect() # Establishes connection to DB

    fdb.cursor.execute('SELECT * FROM test WHERE user=?', [user_name_input])
    for items in fdb.cursor.fetchall():
        print(items)
        print(items[0])

【讨论】:

  • 非常感谢,确实解决了问题!因此,如果我在您提到 check[0][0] 时理解正确,第一个 [0] 是指我要访问的行列表的索引,第二个 [0] 是指其中的项目。
  • check是行列表,check[0]是第一行,check[0][0]是第一行的第一个元素(即查询返回的第一条记录的id
  • 是的,比如check[row][column]
【解决方案2】:

我相信fetchall 会返回一个行列表,所以check[0] 代表第一行,其中第一个元素就是您要查找的元素。它也可能返回一个空列表,我会在访问第一个值之前检查它的长度是否为正

【讨论】:

  • 你是对的,它返回一个行列表。我能够使用 check[0][0] 访问所需的值。谢谢!
猜你喜欢
  • 2017-08-18
  • 2013-07-28
  • 2018-11-16
  • 2017-07-12
  • 2011-10-31
  • 2015-06-26
相关资源
最近更新 更多