вставка словаря в базу данных sqlite3 — python

#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