@Andriilie

Как сделать вывод данных из базы данных в переменную python?

Часть кода в котором возник вопрос:

global ID
ID = cursor.execute("""SELECT OrderNumber FROM orders ORDER BY OrderNumber DESC LIMIT 1;""").fetchall()
ID = ID[0] #list to tuple
ID = ID[0] #tuple to char
ID = int(ID) #char to int
cursor.execute("UPDATE orders SET cost = ? WHERE OrderNumber = ?", (cost, ID))
connect.commit()

Это единтственный способ которым у меня получилось засунуть данные из БД в переменную, которая должна быть Integer, что бы следуйщий запрос на обновление работал коректно. Самое главное, то что в бд это поле уже Integer. Код работает, но я хочу разобраться нельзя ли его упростить и сделать правильным?
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
@bacon
1. перестань использовать global, вот совсем
2. зачем тебе последний OrderNumber? Явная проблема в логике работы
3. если нужна одна строка из базы, используй fetchone, а не fetchall, тогда у тебя сразу будет tuple
4 #list to tuple first tuple from lisr, #tuple to char first element from tuple и можно просто заменить на ID = ID[0][0]
5. OrderNumber не нужно делать int, там уже сразу нужный тип
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
В дополнение к написанному выше @Dr. Bacon, можно сделать так
connect.row_factory = sqlite3.Row
Тогда вместо простых кортежей будут возвращаться объекты, похожие на словари, и можно будет обращаться к полям по имени.
cursor.execute("""SELECT OrderNumber FROM orders ORDER BY OrderNumber DESC LIMIT 1;""")
row = cursor.fetchone()
ID = row['OrderNumber']

Единственное, смена row_factory затронет только курсоры, созданные позднее. Созданные ранее курсоры будут использовать предыдущую фабрику строк. Так что если хочешь это сделать, менять row_factory лучше сразу после открытия соединения.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы