【问题标题】:"TypeError: NoneType is not subscriptable" when executing multiple queries执行多个查询时出现“TypeError: NoneType is not subscriptable”
【发布时间】: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 终端并看到列名错误时才意识到问题出在哪里。

标签: sqlite flask nonetype


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-01-23
    • 2018-10-15
    • 2020-07-04
    • 1970-01-01
    • 2021-11-17
    • 2018-02-05
    • 1970-01-01
    • 2020-11-02
    • 2022-08-13
    相关资源
    最近更新 更多