首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python从mysql查询中删除引号

问用Python从mysql查询中删除引号
EN

Stack Overflow用户
提问于 2016-07-20 06:15:23
回答 2查看 2.4K关注 0票数 0

我知道这个问题在过去就有人提出过,但是彻底的研究似乎并没有解决我的问题。我可能只是遗漏了一些简单的东西,因为我是mysql提供的Python连接器的新手。

我有一个Python脚本,它访问mysql数据库,但我在从查询中删除引号时遇到了问题。这是我的代码:

代码语言:javascript
复制
import mysql.connector

try:
    db = mysql.connector.connect(user='root', password='somePassword', host='127.0.0.1', database='dbName')
    cursor = db.cursor()
    query = "select * from tags where %s = %s"
    a = 'tag_id'
    b = '0'
    cursor.execute(query, (a, b))
    print cursor
    data = cursor.fetchall()
    print data
except mysql.connector.Error as err:
    print "Exception tripped..."
    print "--------------------------------------"
    print err

cursor.close()
db.close()

我的数据库已经正确地设置好了(我很快就会证明)。

我对这个程序的输出是:

代码语言:javascript
复制
MySQLCursor: select * from tags where 'tag_id' = '0'
[]

但是,当我将查询更改为不使用变量时,例如:

代码语言:javascript
复制
cursor.execute("select * from tags where tag_id = 0")

然后我的输出变成:

代码语言:javascript
复制
MySQLCursor: select * from tags where tag_id = 0
[(0, u'192.168.1.110')]

对我来说,这意味着我的游标查询之间唯一的区别是引号。

如何从查询中删除它们?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-20 07:46:12

我个人认为这个代码是正确和安全的,但是您应该非常怀疑使用这样的代码,而不需要自己仔细地检查它,或者(更好的)在安全专家的帮助下。我没有资格成为这样的专家。

我改变了两件重要的事情:

  1. 我将b = '0'更改为b = 0,因此它最终是一个数字,而不是引用的字符串。(这个部分很容易修复。)
  2. 我跳过了列名的内置参数化,并将其替换为我自己对内置到mysql-连接器的转义/引用的轻微修改。这是可怕的部分,应该会让你停下来。

下面是完整的代码,但是如果列名是用户输入,请再次小心!

代码语言:javascript
复制
import mysql.connector

def escape_column_name(name):
    # This is meant to mostly do the same thing as the _process_params method
    # of mysql.connector.MySQLCursor, but instead of the final quoting step,
    # we escape any previously existing backticks and quote with backticks.
    converter = mysql.connector.conversion.MySQLConverter()
    return "`" + converter.escape(converter.to_mysql(name)).replace('`', '``') + "`"

try:
    db = mysql.connector.connect(user='root', password='somePassword', host='127.0.0.1', database='dbName')
    cursor = db.cursor()
    a = 'tag_id'
    b = 0
    cursor.execute(
        'select * from tags where {} = %s'.format(escape_column_name(a)),
        (b,)
    )
    print cursor
    data = cursor.fetchall()
    print data
except mysql.connector.Error as err:
    print "Exception tripped..."
    print "--------------------------------------"
    print err

cursor.close()
db.close()
票数 2
EN

Stack Overflow用户

发布于 2019-01-14 04:28:05

我在使用pymysql时遇到了类似的问题,并展示了我的工作代码here,希望这会有所帮助。

我所做的是在类'pymysql.connections.Connection‘中覆盖转义方法,它明显地在string.周围添加了“”

最好展示我的代码:

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38473598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档