Как сохранить словари разной длины в одной таблице в базе данных? - PullRequest
0 голосов
/ 01 ноября 2018

Каким был бы самый элегантный способ сохранить несколько словарей - большинство из которых следуют одной и той же структуре, но некоторые имеют больше / меньше ключей - в одной таблице базы данных SQL?

Шаги, которые я могу придумать, следующие:

  1. Определите, в каком словаре больше всего ключей, а затем создайте таблицу, которая соответствует порядку ключей в словаре.
  2. Сортировка каждого словаря по порядку столбцов.
  3. Вставить значения каждого словаря в таблицу. Не вставляйте ничего (возможно?), Если для определенного столбца таблицы в словаре нет ключа.

У меня есть черновик кода:

man1dict = {
    'name':'bartek',
    'surname': 'wroblewski',
    'age':32,
    }

man2dict = {
    'name':'bartek',
    'surname': 'wroblewski',
    'city':'wroclaw',
    'age':32,
    }

with sqlite3.connect('man.db') as conn:
    cursor = conn.cursor()

    #create table - how do I create it automatically from man2dict (the longer one) dicionary, also assigning the data type?
    cursor.execute('CREATE TABLE IF NOT EXISTS People(name TEXT, surname TEXT, city TEXT, age INT)')

    #show table
    cursor.execute('SELECT * FROM People')
    print(cursor.fetchall())

    #insert into table - this will give 'no such table' error if dict does not follow table column order
    cursor.execute('INSERT INTO People VALUES('+str(man1dict.values())+')', conn)

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Используйте для этой цели NoSQL базы данных, такие как MongoDB. Они сами справятся с этим. Использование реляционных данных для чего-то, что не является реляционным, это анти-паттерн. Это сломает ваш код, ухудшит масштабируемость вашего приложения, и когда вы захотите изменить структуру таблицы, это будет более громоздким.

0 голосов
/ 01 ноября 2018

Возможно, проще всего сохранить диктовку как рассол, а затем открепить его позже. т.е.

import pickle, sqlite3

# SAVING
my_pickle = pickle.dumps({"name": "Bob", "age": 24})
conn = sqlite3.connect("test.db")
c = conn.cursor()
c.execute("CREATE TABLE test (dict BLOB)")
conn.commit()
c.execute("insert into test values (?)", (my_pickle,))
conn.commit()

# RETRIEVING
b = [n[0] for n in c.execute("select dict from test")]
dicts = []
for d in b:
    dicts.append(pickle.loads(d))
print(dicts)

Это выводит

[{"name": "Bob", "age": 24}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...