«Ошибка типа: нетип не подлежит подписке» при выполнении нескольких запросов

#sqlite #flask #nonetype

Вопрос:

Функция-член, которая извлекает базу данных.

 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')  

Я боролся с этим в течение многих часов. Поиск в Google. Вопросы для чтения здесь.

Любая помощь будет признательна.

Комментарии:

1. Нет, этот вопрос не следует удалять. У кого-то другого может возникнуть та же проблема, что и у вас. Пожалуйста, проверьте, по какой причине это было («отклонение» или «неоднозначное название столбца»), и напишите свой собственный ответ, который объясняет проблему, вы можете помочь кому-то таким образом. На этом сайте можно (даже рекомендуется) ответить на свой собственный вопрос.

2. Скорее всего, это моя оплошность в отношении Инвида. Упростил это с помощью соединения, но не понимал, в чем проблема, пока я не вошел в sql-терминал и не увидел ошибки в названии столбца.

Ответ №1:

Ошибка

 'NoneType' object is not subscriptable  

Означает, что вы пытаетесь получить доступ к ключу объекта объекта, который не существует, т. Е. Объект существует None .

Пожалуйста, проверьте это здесь

 [invid]  

invid не является никаким, т. е. печатью (invid)

Кроме того, проблема может заключаться в том, что здесь

 res['invName']  

res есть None , пожалуйста, проверьте содержимое res (с печатью и т. Д.) Перед доступом invName , как есть None .

Комментарии:

1. Исправлено. У меня либо был отключен инвИд в таблице, либо причиной этого были одни и те же имена столбцов в разных таблицах. Этот вопрос можно удалить.

Ответ №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(идентификатор заказа):
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();
for row in records:
item = OrderItem(row['orderId'], row['inventoryId'],
row['invImg'], row['invName'],
row['orderQuantity'], row['orderPrice'] )
list.append(item)
return list