【问题标题】:Get data from database SQLite3 without Index out of range从数据库 SQLite3 中获取没有索引超出范围的数据
【发布时间】:2021-04-17 14:43:06
【问题描述】:

我需要您的帮助来解决问题。我想用 SQLite3 在数据库中输入数据,但首先我需要从那里获取数据并进行一些计算。这里附上我的代码:

def run_query(query, parameters = ()):
    with sqlite3.connect(db_name) as conn:
        cursor = conn.cursor()
        result = cursor.execute(query, parameters)
        conn.commit()
    return result

def validation():
    return len(name.get()) != 0 and len(quantity.get()) !=0

def addstock():
        time = datetime.now().strftime("%B %d, %Y")
        hour = datetime.now().strftime("%I:%M%p")     
        query = 'SELECT totalstock FROM Stocks WHERE name = (?) ORDER BY MovementID DESC LIMIT 1'
        parameters = (name.get(),)
        lastrecord = run_query(query, parameters)
        total = lastrecord.fetchall()[0]
        if total is None:
            total = 0
        else:
            total = lastrecord.fetchall()[0]
            total += quantity.get()
        query = 'SELECT precio FROM product WHERE name = ?'
        parameters = (name.get(),)
        precio = run_query(query, parameters)
        pricequantity = precio.fetchall()[0]
        pricequantity *= int(quantity.get())
        query = 'SELECT precio FROM product WHERE name = ?'
        parameters = (name.get(),)
        precio = run_query(query, parameters)
        priceforall = precio.fetchall()[0]
        priceforall *= total

        if validation():
            query = 'INSERT INTO stocks VALUES(NULL, ?, ?, ?, ?, ?, ?, ?)'
            parameters = (name.get(), quantity.get(), pricequantity, total, priceforall, time, hour)
            run_query(query, parameters)
            message = 'Stock for {} added succesfully'.format(name.get())
            name.delete(0, END)
            quantity.delete(0, END)
        else:
            message = 'Name and Quantity required' 

数据库中有以下数据:

MovementID(整数)、名称(文本)、数量(真实)、数量价格(真实)、TotalStock(真实)、TotalStockPrice(真实)、时间、小时

问题是我收到 lastrecord.fetchall()[0] 的错误,它说 Index out of range 但我不知道为什么。

其他时候,我有一个错误,只能将元组(不是“str”)连接到元组。

我是python和编程的初学者,不知道如何解决这些问题。

感谢和亲切的问候

【问题讨论】:

  • 如果您在lastrecord.fetchall()[0] 上遇到索引错误,这意味着lastrecord.fetchall() 正在返回一个空列表。您需要为此做好准备,或者尝试找出它为什么没有返回任何内容.

标签: python python-3.x list sqlite tkinter


【解决方案1】:

您不能两次拨打lastrecord.fetchall()。第一次调用获取所有剩余的记录,第二次调用没有要获取的内容。

没有必要调用它两次。变量total已经设置好了,不需要再设置了。

也没有理由调用lastrecord.fetchall() 然后将其编入索引。查询有LIMIT 1,所以它只会返回一行。只需调用 lastrecord.fetchone() 即可获取该单行。

此外,fetchall() 返回一个元组列表。要获取totalrecord 列的值,您需要同时对列表和元组进行索引。

lastrecord = run_query(query, parameters)
row = lastrecord.fetchone()
if row:
    total = row[0]
else:
    total = 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2021-03-14
    • 2018-07-21
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多