我想从大型数据库中执行随机样本,并且我希望将这些样本配对,这意味着我要么关心(一系列)选择语句的结果顺序,要么在之后重新排序。此外,也可能存在重复的行。这很好,但我想要一种有效的方法来直接从数据库中制作这些样本。我知道 SELECT 语句不能与 cursor.executemany 一起使用,但这确实是我想要的。
这里有一个类似的问题 ,OP 似乎要求进行多选,但它对当前的最佳答案感到满意,该答案建议在 where 子句中使用 IN。这不是我真正想要的。我更喜欢 ken.ganong 的解决方案,但想知道它的效率。
更准确地说,我执行以下操作:
import sqlite3
import numpy as np
# create the database and inject some values
values = [
(1, "Hannibal Smith", "Command"),
(2, "The Faceman", "Charm"),
(3, "Murdock", "Pilot"),
(4, "B.A. Baracas", "Muscle")]
con = sqlite3.connect('/tmp/test.db')
cur = con.cursor()
cur.execute(
'CREATE TABLE a_team (tid INTEGER PRIMARY KEY, name TEXT, role TEXT)')
con.commit()
cur.executemany('INSERT INTO a_team VALUES(?, ?, ?)', values)
con.commit()
# now let's say that I have these pairs of values I want to select role's for
tid_pairs = np.array([(1,2), (1,3), (2,1), (4,3), (3,4), (4,3)])
# what I currently do is run multiple selects, insert into a running
# list and then numpy.array and reshape the result
out_roles = []
select_query = "SELECT role FROM a_team WHERE tid = ?"
for tid in tid_pairs.flatten():
cur.execute(select_query, (tid,))
out_roles.append(cur.fetchall()[0][0])
#
role_pairs = np.array(out_roles).reshape(tid_pairs.shape)
对我来说,似乎必须有一种更有效的方式将 SELECT 语句传递给数据库,它请求多行,每行都有自己的常量,但正如我所说的,executemany 不能与 SELECT 语句一起使用。另一种方法是在 WHERE 子句中使用 IN 约束,然后在 python 中创建重复项。
有一些额外的约束,例如,我可能在 db 中有不存在的行,我可能想通过删除输出对或替换为默认值来处理它,但这些都是附带问题。
提前致谢。