执行多个查询时出现“TypeError: NoneType is not subscriptable”

Posted

技术标签:

【中文标题】执行多个查询时出现“TypeError: NoneType is not subscriptable”【英文标题】:"TypeError: NoneType is not subscriptable" when executing multiple queries 【发布时间】:2021-12-26 11:35:48 【问题描述】:

检索数据库的成员函数。

def GetDb(self):
    db = getattr(g, '_database', None)
    if db is None:
        db = g._database = sqlite3.connect(self.path)       
        db.row_factory = sqlite3.Row         
    return db

从数据库查询返回列表的成员函数

def GetOrderItemsList(self, orderid):
    list = []
    with app.app_context():
        db = self.GetDb()             
        cur = db.execute('SELECT * FROM ordersList WHERE orderId = ?',[orderid])
        records = cur.fetchall(); 
        for row in records:                
            print(row)
            invid = row['inventoryId']
            OrderItem 
            OrderItem.orderId = row['orderId']
            OrderItem.productId = row['inventoryId']             
            OrderItem.productName = 'none'
            OrderItem.quantity = row['quantity']
            OrderItem.productPrice = row['price'] 
            nextcur = db.execute('SELECT * FROM inventory WHERE invId = ?', [invid]) 
             
            #nextcur = db.execute('SELECT * FROM inventory WHERE invId = 1') #works
            res = nextcur.fetchone();
            OrderItem.productName = res['invName']
            print(res['invName'])                
            list.append(OrderItem)


    return list

订单项:

class OrderItem(object):     
     def __init__(self, ordId, invId, name, quantity, price):
         self.orderId = ordId
         self.productId = invId
         self.productName = name
         self.quantity = quantity
         self.productPrice = price

错误信息:

Traceback error
OrderItem.productName = res['invName']
TypeError: 'NoneType' object is not subscriptable

错误

nextcur = db.execute('SELECT * FROM inventory WHERE invId = ?', [invid]) 

作品

nextcur = db.execute('SELECT * FROM inventory WHERE invId = 1')

为此奋斗了好几个小时。在谷歌上搜索。在此处阅读问题。

任何帮助将不胜感激。

【问题讨论】:

不,这个问题不应该被删除。其他人可能会遇到与您完全相同的问题。请检查它是哪个原因(“invId off”或“不明确的列名”)并写下您自己的答案来解释问题,您可能会以这种方式帮助某人。在这个网站上回答你自己的问题很好(甚至鼓励)。 我很可能对 invId 有疏忽。通过连接简化了这一点,但直到我进入 sql 终端并看到列名错误时才意识到问题出在哪里。 【参考方案1】:

错误

'NoneType' object is not subscriptable

表示您正在尝试访问不存在的对象的对象键,即对象为None

请看这里

[invid]

invid 不是 None,即打印(invid)

另外,问题可能出在此处

res['invName']

resNone,请在访问invName之前检查res的内容(带有打印等),因为它是None

【讨论】:

已修复。我要么在表中关闭了 invId,要么在不同表中的相同列名导致了这种情况。此问题可以删除。【参考方案2】:

修复订单产品列表的连接、项目实例和 img。

库存和订单项

create table inventory(invId integer PRIMARY KEY AUTOINCREMENT NOT NULL, invName varchar(50), description varchar(100), invImg varchar(50) ,category integer ,quantity integer, price real);create table ordersList(orderId integer, inventoryId integer, orderQuantity integer, orderPrice real);

class OrderItem(object): def __init__(self, ordId, invId, img, name, quantity, price): self.orderId = ordId self.productId = invId self.productName = name self.productImg = img self.quantity = quantity self.productPrice = price

def GetOrderItemsList(orderid): list = [] db = get_db() cur = db.execute('SELECT orderId, inventoryId, orderQuantity, orderPrice, inventory.invName AS invName, inventory.invImg AS invImg FROM ordersList INNERJOIN inventory ON inventory.invId= ordersList.inventoryId WHERE orderId = ?', [orderid]) records = cur.fetchall();@987654337 @ item = OrderItem(row['orderId'], row['inventoryId'], row['invImg'], row['invName'], row['orderQuantity'], row['orderPrice'] ) list.append(item) return list

【讨论】:

以上是关于执行多个查询时出现“TypeError: NoneType is not subscriptable”的主要内容,如果未能解决你的问题,请参考以下文章

执行 linq 查询时出现超时错误

执行 vba 查询 ms 访问时出现运行时错误 3075

执行 SQL 查询时出现 Wix 错误 -2147217900

使用 JDBC 驱动程序执行 Sql 查询时出现 NetworkOnMainThreadException

执行查询时出现“选择列表中的列名无效”错误

在循环TimeoutError中启动多个select查询时出现错误:ResourceRequest超时