我有一个键值对词典,例如{'a': 1, 'b': 2, 'c': 3}
和MySQL表,例如
key value extra
a 1 ...
b 2 ...
c 3 ...
我想要做的是SELECT
其键和值在我的字典中的所有行(显然是他们的额外数据)。由于字典是动态创建的,并且可能很大(100个键值),我想知道最好的方法是什么。
我想到的两个选项是,
动态生成SQL查询,例如
query = []
param = []
for i in d.items():
query.append('(key = ? AND value = ?)')
param.extend(i)
execute('SELECT * FROM t WHERE ' + ' OR '.join(query), param)
缺点:我不喜欢动态代码生成。它更难调试,维护和扩展,更容易出现漏洞等。
创建一个临时表,例如
CREATE TEMPORARY TABLE tmp (key VARCHAR(255), value VARCHAR(1023));
填充它,例如
stmt = compile('INSERT INTO tmp (key, value) VALUES (?, ?)')
stmt.execute_many(d.items())
然后使用连接,例如
SELECT * FROM t JOIN tmp ON (t.key = tmp.key AND t.value = tmp.value)
缺点:我不确定,但创建临时表并仅发出批量插入以执行单个连接似乎效率低于发出单个查询。
我的问题是,还有其他选择吗?哪个选项最好?
感谢。