如何基于dict的值(也可以是列表)动态生成SQLite插入查询?

时间:2019-06-17 16:47:01

标签: python sqlite

我正在尝试编写一个动态查询,该查询将我的字典并写入数据库。

字典可以是任意大小,可以有任意数量的键,并且看起来像这样:

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:数据库中上述字典的表如下所示:

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 :(得分:0)

根据进一步的研究,我相信可以通过使用笛卡尔积基于所提供的命令列出命令列表来实现。

请参见Combine Python Dictionary Permutations into List of Dictionaries