Python sqlite3 动态占位符构建 where 条件

2 投票
1 回答
1238 浏览
提问于 2025-04-18 18:20

我有一个表单,里面有4个输入框。当我点击提交按钮时,会根据这4个输入框的内容从数据库中获取结果。我并没有强制用户填写任何内容,所以用户可能会留空所有输入框,或者只填写部分。如果用户填写的内容越多,从数据库得到的结果就会越准确。

我遇到的问题是,如何动态构建查询中的条件部分,只使用那些用户填写的输入框。我的查询是这样的。如果其中一个输入框是空的,查询就不会返回任何结果,而我的本意是:如果输入框是空的,就在查询数据库时忽略它。

cursor.execute('''
        SELECT name, id, gender, age, address, phones, mails, gender, age, hair_color                     
        FROM persons
        WHERE 
           name = ? AND            
           id = ? AND 
           gender = ? AND 
           age = ? 
        ''', (name_input, id_input, gender_input, age_input))

1 个回答

4

你可以动态地创建WHERE条件:

sql = "SELECT ... WHERE 1"
parameters = []
if name_input != "":
    sql += " AND name = ?"
    parameters += [name_input]
if id_input != "":
    sql += " AND id = ?"
    parameters += [id_input]
...

或者,你可以重写WHERE条件,让空值被忽略:

SELECT ... WHERE (name = ?1 OR ?1 = '') AND (id = ?2 OR ?2 = '') AND ...

(?n表示第n个参数.)

撰写回答