Python sqlite3构建部分与动态占位符

时间:2014-08-24 08:41:43

标签: python sqlite placeholder

我有一个表单有4个输入字段,当点击提交按钮时,我根据这4个输入从数据库中提取结果。我并没有强迫用户输入任何输入,所以我可以获得所有空白输入或部分空白。用户填充的输入越多,数据库的结果就越精确。

我的问题是如何仅使用填充的占位符动态构建查询的where部分。这是我的查询。这样,如果其中一个输入为空,则查询将不会获取任何内容,而我的意图则相反:如果输入为空,则在查询数据库时不要考虑。

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 个答案:

答案 0 :(得分:3)

您可以动态创建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 specifies the n-th parameter。)