Как динамически генерировать запросы вставки SQLite на основе значений dict, которые также могут быть списком? - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь написать динамический запрос, который принимает мой запрос и записывает его в базу данных.

Диктофон может быть любого размера, с любым количеством клавиш и может выглядеть так:

dict = {
    'name': 'foo',
    'date': '2008',
    'genre': ['bar', 'baz']
}

Проблема в том, что значения в словаре могут быть либо строкой, либо списком строк. Используя уже имеющуюся функцию, я могу генерировать запросы динамической длины, но только для значения, которое является строкой, а не списком строк.

def insert_data(metadata):
    conn = sql.connect(utils.get_db_path())

    _insert_data(conn,
                 'albums',
                 name=metadata['album'],
                 date=metadata['date'],
                 tracktotal=metadata['tracktotal'],
                 disctotal=metadata['disctotal']
                 )

def _insert_data(conn, table_name, **metadata):
    c = conn.cursor()
    query = f'INSERT INTO {table}({", ".join(metadata.keys())}) VALUES({",".join(["?"] * len(metadata))})'
    c.execute(query, tuple(value for value in metadata.values())

Запрос, сгенерированный этим кодом, будет выглядеть так:

INSERT INTO albums(name, date, tracktotal, disctotal) VALUES(?,?,?,?)

Однако, если значения представляют собой список строк, мне нужно сгенерировать несколько запросов, что еще сложнее, когда несколько значений представляют собой список, а не только один (например, дата и жанр являются списком, в этом если мне нужно 2 ^ 2 = 4 запроса)

Каков был бы способ сделать это, или есть другой подход, который не требует такого большого количества запросов?

EDIT1: таблица в базе данных для вышеупомянутого dict будет выглядеть следующим образом:

TABLE albums
id   name    date
1    foo     2008

TABLE genres
id   name 
1    bar
2    baz

TABLE albumgenres
id    album_id   genre_id
1     1          1
2     1          2

Запись в альбомы легко, потому что там нет дубликатов, но код для вызова функции для жанров будет выглядеть так:

 _insert_data(conn, 
             'genres', 
             name='['bar', 'baz']
             )

и больше не работает должным образом.

1 Ответ

0 голосов
/ 18 июня 2019

После дальнейших исследований я считаю, что этого можно достичь, составив список диктов на основе предоставленных диктов, используя декартово произведение.

См. Объединение перестановок словаря Python в список словарей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...