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.

Есть несколько дополнительных ограничений, например, у меня могут быть несуществующие строки в БД, и я могу захотеть справиться с этим, отбросив выходную пару или заменив ее значением по умолчанию, но эти вещи являются побочной проблемой.

Заранее спасибо.

0 ответов

Другие вопросы по тегам