Python使用SQL动态多个查询条件

在进行数据库查询的过程中,有时候需要根据用户输入的不固定条件来动态构建查询语句。Python可以通过拼接SQL语句来实现这一需求,同时也可以使用参数化查询来防止SQL注入攻击。

动态构建查询条件

假设我们有一个学生信息的数据库表,包括字段:idnameagegender。用户可以根据姓名、年龄、性别来进行查询,但用户可能只输入其中的某些条件,因此需要动态构建查询语句。

import pymysql

def search_students(name=None, age=None, gender=None):
    conn = pymysql.connect(host='localhost', user='root', password='password', database='test_db')
    cursor = conn.cursor()

    sql = "SELECT * FROM students WHERE 1=1"
    params = []

    if name:
        sql += " AND name=%s"
        params.append(name)
    if age:
        sql += " AND age=%s"
        params.append(age)
    if gender:
        sql += " AND gender=%s"
        params.append(gender)

    cursor.execute(sql, params)
    result = cursor.fetchall()

    conn.close()
    return result

在上面的代码中,我们定义了一个search_students函数,根据用户输入的姓名、年龄、性别动态构建查询条件,并执行SQL查询语句。通过向SQL语句中传递参数来实现多条件查询。

参数化查询

为了防止SQL注入攻击,我们可以使用参数化查询。参数化查询将用户输入的值作为参数传递给SQL语句,而不是直接拼接到SQL语句中。

def search_students_safe(name=None, age=None, gender=None):
    conn = pymysql.connect(host='localhost', user='root', password='password', database='test_db')
    cursor = conn.cursor()

    sql = "SELECT * FROM students WHERE 1=1"
    conditions = []

    if name:
        conditions.append("name=%s")
    if age:
        conditions.append("age=%s")
    if gender:
        conditions.append("gender=%s")

    if conditions:
        sql += " AND " + " AND ".join(conditions)

    params = [name, age, gender]

    cursor.execute(sql, params)
    result = cursor.fetchall()

    conn.close()
    return result

在这个函数中,我们将条件拼接到一个列表中,然后使用join方法拼接到SQL语句中。最后将参数传递给execute方法执行查询。

总结

在Python中,我们可以通过拼接SQL语句或使用参数化查询来实现动态多个查询条件的功能。在处理用户输入时,建议使用参数化查询以防止SQL注入攻击,保障数据库的安全性。

stateDiagram
    [*] --> Search
    Search --> SafeSearch: Use Safe Search
    SafeSearch --> [*]

通过上述方法,我们可以轻松实现动态多个查询条件的功能,提高了程序的灵活性和安全性。希望本文对你有所帮助,谢谢阅读!