【问题标题】:Writing a query using like with python and mysql connector使用 like 与 python 和 mysql 连接器编写查询
【发布时间】:2017-05-04 10:30:18
【问题描述】:

如何使用 mysql 连接器和 python 编写查询。我试图避免 sql 注入,并且不能使用 ORM。

       param = 'bob'
       select_query = mysql_conn.query_db("select * from table_one where col_name like '%?%' order by id asc limit 5", param)

无论我在执行查询时发送什么,我都会得到相同的结果。我应该什么也得不到。

当我使用下面的查询时,我得到一个错误。

        select_query = mysql_conn.query_db("select * from table_one where col_name like %s order by id asc limit 5", param)

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“%s order by id asc limit 5”附近使用正确的语法

【问题讨论】:

    标签: python mysql python-3.x wildcard


    【解决方案1】:

    您需要在转义之前将% 通配符添加到您传递的param,例如:

    select_query = mysql_conn.query_db(
        "select * from table_one where col_name like %s order by id asc limit 5",
         ("%{}%".format(param),)
    )
    

    此外,参数应该像上面一样作为元组传递,或者在使用命名参数时作为字典传递:

    select_query = mysql_conn.query_db(
        "select * from table_one where col_name like %(p)s order by id asc limit 5",
         {"p": "%{}%".format(param)}
    )
    

    【讨论】:

    • 那行得通。谢谢。我还有另一个问题。我将参数设置为元组,然后将查询和元组发送到我的连接类。但这失败了吗?我必须将参数设置为连接类中的元组。
    • param = (request.form['txt'],) 在我的连接类 class get_connectioned(): def query_db(self, query, param): self.curr. execute(query, (param) return self.curr 以上失败。但如果我执行以下操作。param = request.form['txt'] class get_connectioned(): def query_db(self, query, param): self.curr.execute(query, ("%{}%".format(param),)) return self.curr 为什么在类中将参数设置为元组。但是将参数发送为元组失败了?
    • @user3525290 在评论中很难说这样的代码。它应该做的大致相同,除了第一个按原样使用参数,而第二个将它括在通配符中..
    【解决方案2】:

    请注意,查询字符串中的任何文字百分号都传递给 execute() 必须转义,即 %%

    http://mysql-python.sourceforge.net/MySQLdb.html

    这与旧式 python 字符串格式化、c printf 等几乎相同

    【讨论】:

      【解决方案3】:

      您需要在转义之前将 % 通配符添加到您传递的参数中,例如:

      select_query = mysql_conn.query_db( "select * from table_one where col_name like %s order by id asc limit 5", ("%{}%".format(param),) )

      给我一​​个错误提示

      TypeError: 需要一个类似字节的对象,而不是“元组”

      所以对我有用的是将引号明确编码到选择引用中,如下所示:

        "select * from table_one where col_name like \"%"+param+"%\" order by id asc limit 5"
      

      【讨论】:

        猜你喜欢
        • 2010-12-28
        • 2015-06-18
        • 2015-11-01
        • 2015-05-26
        • 1970-01-01
        • 2014-07-27
        • 2019-06-17
        • 2020-05-10
        • 2015-01-14
        相关资源
        最近更新 更多