Python sqlite3 выбрать несколько строк с дубликатами
Я хочу выполнить случайные выборки из большой базы данных, и я хочу, чтобы эти выборки были объединены в пару, что означает, что я либо забочусь о порядке результатов из (ряда) оператора (ов) выбора, либо переупорядочиваю впоследствии. Кроме того, могут быть дубликаты строк. Это хорошо, но я хочу эффективный способ сделать эти образцы прямо из БД. Я понимаю, что операторы SELECT нельзя использовать с cursor.executemany, но на самом деле это то, что я хотел бы.
Здесь есть аналогичный вопрос, когда OP, кажется, запрашивает множественный выбор, но его устраивает текущий топовый ответ, который предлагает использовать IN в предложении where. Это не то, что я ищу на самом деле. Я бы предпочел что-то более похожее на решение 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. Альтернативой является использование ограничения IN в предложении WHERE, а затем создание дубликатов внутри python.
Есть несколько дополнительных ограничений, например, у меня могут быть несуществующие строки в БД, и я могу захотеть справиться с этим, отбросив выходную пару или заменив ее значением по умолчанию, но эти вещи являются побочной проблемой.
Заранее спасибо.