Я пытаюсь написать динамический запрос, который принимает мой запрос и записывает его в базу данных.
Диктофон может быть любого размера, с любым количеством клавиш и может выглядеть так:
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']
)
и больше не работает должным образом.