Как загрузить словарь? Python в sqlite3 таблицу?
Есть таблица sqlite3
, в ней 3 столбца (условно "A", "B" и "C") и 100+ строк.
Столбцы A
и B
уже заполнены, столбец A
является Unique
и используется как ключ.
Я получаю данные из таблицы, выполняю с ними определенные действия и хочу заполнить столбец C
результатом.
Мой код (упрощенно, вырезал все лишнее):
# records_list = {}
records_list = []
try:
sqlite_connection = sqlite3.connect('db.db')
cursor = sqlite_connection.cursor()
print("БД Успешно подключена к SQLite")
sqlite_select_query = """SELECT DISTINCT B FROM table;""" # LIMIT 5;""" # - использовалось для тестов
for record in сursor.execute(sqlite_select_query).fetchall():
# records_list[record[0]] = do_work(record[0])
records_list.append((do_work(record[0]), record[0]))
# do_work() - условная функция, выполняющая все необходимые действия со значением из столбца B
# в дальнейшем результат do_work'а будет записан в столбец C
print('Ура! Я выполнил первую часть!')
if records_list: # я проверил, что словарь не пуст
sqlite_update_query = """UPDATE table SET C = ? WHERE B = ?"""
cursor.executemany(sqlite_update_query, records_list)
sqlite_connection.commit()
print("Записей", cursor.rowcount, ". Успешно обновлены")
sqlite_connection.commit()
else:
print("Список пуст")
cursor.close()
except sqlite3.Error as error:
print("Ошибка при работе с sqlite:", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")
Для теста добавляю в SELECT
LIMIT 5
.
По результатам при попытке исполнения в выводе я вижу вот такое:
Ура! Я выполнил первую часть!
Ошибка при работе с sqlite: Incorrect number of bindings supplied. The current statement uses 2, and there are 432 supplied.
Соединение с SQLite закрыто
Насколько я понял, нужно то ли как то переделать мой словарь (в не-словарь?), то ли саму команду executemany
. Но никак не получается найти/сообразить чего именно и как это сделать правильно.
А еще меня смущает - откуда он в словаре из 5 пар (limit 5
же) - нашел 432 чего то там?
По идее, конечно, можно загнать в цикл по records_list
и делать 100+ отдельных UPDATE
, но это кажется не правильным решением.