我真的不知道问我问题的好方法。我想要做的是使用由元组确定的条件搜索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”,我希望约翰,弗雷德和格雷格因为他们居住在纽约。
答案 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()