SQLite3:有没有办法仅使用元组的一部分来选择所有记录?

时间:2020-07-13 13:57:40

标签: python sqlite

我真的不知道问我问题的好方法。我想要做的是使用由元组确定的条件搜索sqlite3数据库。第一部分是我通常会如何做,并且print语句按预期工作:

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)

在这种情况下,我希望约翰·史密斯(John Smith)和弗雷德·史密斯(Fred Smith)都可以打印,因为他们都是史密斯,都住在纽约。

另一个例子是,如果我只输入search_city为“ NY”,我希望约翰,弗雷德和格雷格因为他们居住在纽约。

2 个答案:

答案 0 :(得分:0)

要检索结果,您需要向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')]

随意使用查询逻辑。根据您的要求,您可能需要创建单独的查询以获得所需的输出。

答案 1 :(得分:0)

稍微动态查询的常用方法是从已知的块构建查询。我在这里写:

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()