SQLite3: есть ли способ выбрать все записи, используя только часть кортежа? - PullRequest
0 голосов
/ 13 июля 2020

Я действительно не знаю, как правильно задать свой вопрос. Я хочу иметь возможность выполнять поиск в базе данных sqlite3 с критериями, определяемыми кортежем. Первый раздел - это то, как я бы делал это обычно, и оператор печати работает так, как ожидалось:

import sqlite3 as sql

conn = sql.connect("Table.db")
cur = conn.cursor()
cur.execute("""CREATE TABLE IF NOT EXISTS db_table([name] text, [surname] text, [city] text, [state] text)""")
conn.commit()

cur.execute("""INSERT INTO db_table VALUES ("John", "Smith", "New York", "NY")""")
cur.execute("""INSERT INTO db_table VALUES ("Jacob", "Smith", "Chicago", "IL")""")
cur.execute("""INSERT INTO db_table VALUES ("Fred", "Smith", "Buffalo", "NY")""")
cur.execute("""INSERT INTO db_table VALUES ("Greg", "Allen", "Albany", "NY")""")
conn.commit()

search_name_1 = "John"
search_surname_1 = "Smith"
search_city_1 = "New York"
search_state_1 = "NY"
search_1 = (search_name_1, search_surname_1, search_city_1, search_state_1)

cur.execute("""SELECT * FROM db_table WHERE (name, surname, city, state)=(?,?,?,?)""", search_1)
results_1 = cur.fetchall()
print(results_1)

Если бы критерии поиска изменились (скажем, с записью tkinter), мог бы я по-прежнему искать, используя только некоторые индексов кортежа? Вот так:

import sqlite3 as sql

conn = sql.connect("Table.db")
cur = conn.cursor()
cur.execute("""CREATE TABLE IF NOT EXISTS db_table([name] text, [surname] text, [city] text, [state] text)""")
conn.commit()

cur.execute("""INSERT INTO db_table VALUES ("John", "Smith", "New York", "NY")""")
cur.execute("""INSERT INTO db_table VALUES ("Jacob", "Smith", "Chicago", "IL")""")
cur.execute("""INSERT INTO db_table VALUES ("Fred", "Smith", "Buffalo", "NY")""")
cur.execute("""INSERT INTO db_table VALUES ("Greg", "Allen", "Albany", "NY")""")
conn.commit()

search_name_2 = "*"
search_surname_2 = "Smith"
search_city_2 = "*"
search_state_2 = "NY"
search_2 = (search_name_2, search_surname_2, search_city_2, search_state_2)

cur.execute("""SELECT * FROM db_table WHERE (name, surname, city, state)=(?,?,?,?)""", search_2)
results_2 = cur.fetchall()
print(results_2)

В этом случае я хотел бы, чтобы печатали и Джон Смит, и Фред Смит, потому что они оба Смит и живут в Нью-Йорке.

Другой пример: если бы я введите search_city только как «Нью-Йорк», я бы ожидал, что Джон, Фред и Грег, потому что они живут в Нью-Йорке.

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Обычный способ для слегка динамичных c запросов - это построение запроса из известных блоков. Здесь я бы написал:

def find(cur, search_name_1, search_surname_1, search_city_1, search_state_1):
    qry = 'SELECT * FROM db_table'
    params = []
    values = []
    if search_name_1 != '*':
        params.append('name')
        values.append(search_name_1)
    if search_surname_1 != '*':
        params.append('surname')
        values.append(search_surname_1)
    if search_city_1 != '*':
        params.append('city')
        values.append(search_city_1)
    if search_state_1 != '*':
        params.append('state')
        values.append(search_state_1)
    if len(params) != 0:
        qry += ' WHERE (' + ','.join(params) + ')=(' + ','.join(['?'] * len(params)) + ')'
    return cur.execute(qry, values).fetchall()
0 голосов
/ 13 июля 2020

Чтобы получить результаты, вам нужно передать какой-то запрос в базу данных sqlite, попробуйте что-то вроде:

search_name_2 = ""
search_surname_2 = "Smith"
search_city_2 = ""
search_state_2 = "NY"

cur.execute(f"""SELECT * 
                FROM db_table 
                WHERE name = '{search_name_2}' or 
                      surname = '{search_surname_2}' or
                      city = '{search_city_2}' or
                      state = '{search_state_2}'""")
results_2 = cur.fetchall()
print(results_2)

[('John', 'Smith', 'New York', 'NY'),
 ('Jacob', 'Smith', 'Chicago', 'IL'),
 ('Fred', 'Smith', 'Buffalo', 'NY'),
 ('Greg', 'Allen', 'Albany', 'NY')]

Не стесняйтесь поиграть с логом запросов c. Учитывая ваши требования, вам может потребоваться создать отдельные запросы для получения желаемого результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...