Python sqlite3 构建带有动态占位符的部分

Posted

技术标签:

【中文标题】Python sqlite3 构建带有动态占位符的部分【英文标题】:Python sqlite3 build where part with dynamic placeholders 【发布时间】:2014-10-17 15:55:11 【问题描述】:

我有一个包含 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】:

您可以动态创建 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.)

【讨论】:

以上是关于Python sqlite3 构建带有动态占位符的部分的主要内容,如果未能解决你的问题,请参考以下文章

带有占位符的 FormatMessage

带有模板占位符的 Url Helper 路由

iOS 13 - 带有占位符的 UITextField 让应用程序崩溃

Laravel 数据库选择带有占位符的下拉菜单

带有位置占位符的 ON DUPLICATE KEY UPDATE 的语法

IE10+ 上的 AngularJS,带有占位符的文本区域导致“无效参数”。