Python-MySQL:在运行db.execute时删除查询中变量值的单引号(str,vars)

时间:2017-06-16 20:31:48

标签: python-3.x mysql-python

我正在运行此代码

    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服务器版本对应的手册,以便在''statuser'附近使用正确的语法,其中userid ='14''在第1行

传递的参数是:

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

据我了解,传递给MySQL的查询是

  

从'statuser'中选择*,其中userid ='14'

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

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

2 个答案:

答案 0 :(得分:1)

您可以在python中使用&字符串:

.format()

答案 1 :(得分:1)

我在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()