【问题标题】:mysql query using python 3.6 (string variable is in single quotes)使用python 3.6的mysql查询(字符串变量用单引号括起来)
【发布时间】:2020-08-27 12:08:05
【问题描述】:

我是 python 和 mysql 的新手。我在为 mysql 填充正确的查询语句时遇到问题。

    sql = "SELECT * FROM Persons WHERE %s"
    cur = db.cursor()
    cur.execute(sql,(where,))

where 是一个字符串变量,它为 WHERE 子句创建一个字符串;这是问题的关键。当我打印此变量时,它会给出以下结果: 性别 = True 和 IsLate = False (没有任何引号)但是当我将此变量添加到查询中以执行它时,它会在字符串周围添加单引号。 我用了命令

    print(cur.statement) 

并打印: SELECT * FROM Persons WHERE 'Gender = True And IsLate = False' 提供参数后,将其放在单引号内,查询返回 0 行。 我已经通过将查询语句和变量连接在一起并将字符串作为查询执行来解决,这很有效,

    sql = sql + where
    cur.execute(sql)

但我知道这不是专业的方式,因为我搜索并发现专业的方式是使用参数化查询并使用变量来存储条件并在执行查询时提供它。 寻求建议,我的想法是否正确?

【问题讨论】:

    标签: mysql quotes


    【解决方案1】:

    cursor.execute() 中使用参数替换的全部意义在于它可以保护您免受 SQL 注入。每个参数都被视为文字值,不会被替换到查询中并重新解释。

    如果您真的希望它被解释,您需要使用字符串格式或连接,正如您发现的那样。但是在验证输入时您必须非常小心,因为用户可能会提供您可能没有预料到的额外 SQL 代码,并导致查询出现故障。

    您应该做的是动态构建where 字符串和参数列表。

    where = []
    params = []
    if gender_supplied:
        where.append('gender = %s')
        params.append(gender)
    if islate_supplied:
        where.append*('islate = %s')
        params.append(islate)
    
    sql = 'select * from persons'
    if where:
        query = sql + ' where ' + ' and '.join(where)
    else:
        query = sql
    
    cur.execute(query, params)
    

    【讨论】:

    • "每个参数都被视为文字值" 我想从用户输入中收集参数值,可能是 1 个或更多,这就是为什么我想将所有给定参数连接到一个字符串中, 并将其用作参数。但在这种情况下,python 在字符串周围添加单引号,使查询返回 0 行(空集)。我想要的是将字符串存储在变量中,以便它可以正确地用作参数(不带引号)。
    • 在当前场景中,用户输入收集了两个条件,即 1) 性别 2) IsLate 但它们可以更多
    • 添加引号是使其成为单个文字值的方式。每个条件都需要一个单独的参数。
    • 我已经更新了答案,以展示如何动态构建查询并使用参数。
    • 谢谢巴尔玛!我会试一试,然后给你反馈。
    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    相关资源
    最近更新 更多