Как в sqlite вставить dict (python)
Как в sqlite через python полностью засунуть словарь?
Делаю вот так
for i in data_dict:
created_at = i['created_at']
data = (str(i), created_at)
# Вот тут всё норм, нету никаких слешей
print(str(i)) # Вывод: {'order_id': 285556196, 'order_number': '30548', posting_number': '305484', 'status': 'delivering', 'cancel_reason_id': 0}
cursor.execute("INSERT INTO Market (data, created_at) VALUES(?, ?);", (data))
conn.commit()
Потом
sql = "SELECT data FROM Market WHERE created_time >= ? AND created_time <= ?;"
cursor.execute(sql, data)
res = cursor.fetchall()
И получаю свою строку с кучей слешей
print(res) # Выводит [('{\'order_id\': 285556196, \'order_number\': \'30548\', \'posting_number\': \'305484\', \'status\': \'delivering\', \'cancel_reason_id\': 0}')]
Да знаю что так не делается, но у меня dict из сотен разных объектов, делать колонки и записывать туда только элемент не реально, нужно засунуть целиком dict
Ответы (1 шт):
Лишних обратных слешей на самом деле в строке нет, они добавляются только при выводе строки в одинарных кавычках, чтобы экранировать внутренние одинарные кавычки (и было понятно, что на внутренней одинарной кавычке строка не заканчивается).
Обратно в словарь конвертируете с помощью ast.literal_eval (более безопасная функция чем eval, она просто разберет структуру данных в строке, но не будет выполнять любой переданный код).
Пример конвертации (на входе результат запроса в виде списка, где каждая строка - tuple из одного элемента):
import ast
res = cursor.fetchall()
dicts = [ast.literal_eval(row[0]) for row in res]
Также лучше сохранять словари в базу в виде json, тогда у вас не будет явной привязки к синтаксису Python, можно будет практически на любом языке программирования работать с этими данными. Пример:
import json
# Запись в базу
for data in data_dict:
created_at = data['created_at']
cursor.execute("INSERT INTO Market (data, created_at) VALUES(?, ?);", (json.dumps(data), created_at)
conn.commit()
# Чтение из базы
sql = "SELECT data FROM Market WHERE created_time >= ? AND created_time <= ?;"
cursor.execute(sql, (begin_time, end_time))
res = cursor.fetchall()
data = [json.loads(row[0]) for row in res]