【问题标题】:Python-MySQL : removing single quotes around variable values in query while running db.execute(str, vars)Python-MySQL:在运行 db.execute(str, vars) 时删除查询中变量值周围的单引号
【发布时间】:2017-11-19 17:17:21
【问题描述】:

我正在运行这段代码

    def details(self, dbsettings, payload):
        res = None
        with UseDatabase(dbsettings) as db:
            sql = "select * from %(tablename)s where userid = %(userid)s"
            result = db.run_query_vals(sql, payload)
            res = result.fetchall()
        return res

但出现错误

SQLError: 1064 (42000): 你的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的 ''statuser' where userid = '14'' 附近使用正确的语法

传递的参数是:

sql = "select * from %(tablename)s where userid = %(userid)s"
payload = {'tablename' : 'statuser', 'userid' : 14}

据我了解,传递给 MySQL 的查询类似于

select * from 'statuser' where userid = '14'

这是我得到错误的地方;表名不应该用引号引起来。如何在不带引号的情况下包含名称/使它们成为反引号?

(我不想硬编码表名 - 这是一个变量,在类创建期间根据不同的参数进行初始化)。这里有什么帮助吗?

【问题讨论】:

    标签: python-3.x mysql-python


    【解决方案1】:

    您可以在 python 中使用字符串中的.format()

    def details(self, dbsettings, payload):
        res = None
        with UseDatabase(dbsettings) as db:
            sql = "select * from {tablename} where userid = {userid}"
            sql = sql.format(**payload)
            # result = db.run_query_vals(sql, payload) # Method to run query
            res = result.fetchall()
        return res
    

    【讨论】:

      【解决方案2】:

      我在pymysql中也遇到了同样的问题,已经想出了解决办法:

      重写类 'pymysql.connections.Connection' 中的转义方法,这显然会在你的字符串周围添加“'”。

      不知道对你的情况是否有帮助,只是分享一种可能的方法

      类似问题:How to remove extra quotes in pymysql

      这是我的代码:

      from pymysql.connections import Connection, converters
      
      
      class MyConnect(Connection):
          def escape(self, obj, mapping=None):
              """Escape whatever value you pass to it.
      
              Non-standard, for internal use; do not use this in your applications.
              """
              if isinstance(obj, str):
                  return self.escape_string(obj)  # by default, it is :return "'" + self.escape_string(obj) + "'"
              if isinstance(obj, (bytes, bytearray)):
                  ret = self._quote_bytes(obj)
                  if self._binary_prefix:
                      ret = "_binary" + ret
                  return ret
              return converters.escape_item(obj, self.charset, mapping=mapping)
      
      
      config = {'host':'', 'user':'', ...}
      conn = MyConnect(**config)
      cur = conn.cursor()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-21
        • 2018-03-02
        • 1970-01-01
        • 2014-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多