#python #database #sqlite #dictionary
#python #База данных #sqlite #словарь
Вопрос:
Я пытаюсь сохранить словарь в базе данных SQLite (python) и иметь возможность извлекать его из базы данных и использовать его как любой другой dict в python, и, похоже, это не работает. Я пробовал использовать json.dumps() и все еще безуспешно.
Это моя таблица:
cursor.execute("""
CREATE TABLE IF NOT EXISTS users(
email TEXT PRIMARY KEY NOT NULL,
password TEXT NOT NULL,
ip_dict VARIANT NOT NULL);
""")
и я хотел бы вставить dict в столбец «ip_dict», например:
ip_dict = {"pc1": "192.168.1.2", "router": "192.168.1.1"}
я пытался делать:
ip_dict = json.dumps(ip_dict)
cursor.execute(f"""
INSERT INTO users(email,password,ip_dict)
VALUES("example@gmail.com", "123456789", {ip_dict})
""")
но безуспешно.
Спасибо
Комментарии:
1. Отредактируйте вопрос и добавьте, что означает «безуспешно».
Ответ №1:
Во-первых, я бы не стал накладывать словарь на его строковое (т. Е. JSON) представление; Я бы использовал отдельную переменную, чтобы все было правильно. Но поскольку теперь у вас есть строковое представление, и вы хотите сохранить это значение в ТЕКСТОВОМ столбце, больше ничего не нужно делать (я не знаю, чего вы пытались достичь, окружив строку {}
):
ip_dict_json = json.dumps(ip_dict)
cursor.execute(f"""
INSERT INTO users(email,password,ip_dict)
VALUES('example@gmail.com', '123456789', ?)
""", (ip_dict_json,))
Обратите внимание, что я использую одинарные кавычки для представления строковых литералов, поскольку это более распространенный и переносимый метод для этого, и что строковое значение для словаря передается в качестве параметра в подготовленный оператор.
Обновить
Если вы хотите стать более сложным, вы можете определить тип столбца как специальный тип, такой как dictionary
, а затем указать adapter
и converter
для этого типа:
cursor.execute("""
CREATE TABLE IF NOT EXISTS users(
email TEXT PRIMARY KEY NOT NULL,
password TEXT NOT NULL,
ip_dict dictionary NOT NULL);
""")
import json
sqlite3.register_adapter(dict, lambda d: json.dumps(d).encode('utf8'))
sqlite3.register_converter("dictionary", lambda d: json.loads(d.decode('utf8')))
cursor.execute(f"""
INSERT INTO users(email,password,ip_dict)
VALUES('example@gmail.com', '123456789', ?)
""", (ip_dict,)) # passing a dictionary and not a string
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()
for row in rows:
print(row[2]) # this is a dictionary and not a string