#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