【问题标题】:In Python how do I escape a single quote within a string that will be used as a SQL statement?在 Python 中,如何在将用作 SQL 语句的字符串中转义单引号?
【发布时间】:2017-04-02 00:53:38
【问题描述】:

我构建了一个简单的语句来在 MySQL 表上运行 load data local infile。我正在使用 Python 生成字符串并运行查询。所以我使用的是Python包pymysql

这是构建字符串的行。假设metadata_filename 是一个正确的字符串:

load_data_statement = """加载数据本地infile """ + metadata_filename + """INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '\'';"""

我最初有字符串替换,并想看看这是否是问题,但不是。如果我编辑上面的语句并推荐 ENCLOSED BY 部分,它可以运行,但不能正确加载数据,因为我需要封闭的字符

如果我print(load_data_statement),我会得到看似正确的 SQL 代码,但 SQL 连接器似乎无法读取它。这是打印出来的:

加载数据本地 infile 'filename.txt' INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY ''';

这一切似乎都是正确的,但 Mysql 引擎并没有接受它。我应该在 Python 中编辑什么来转义单引号或正确编写它?

编辑:

我一直在运行字符串替换替代方案,但仍然遇到问题:load_data_statement = """load data local infile 'tgt_metadata_%s.txt' INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '\'';""" % metadata_filename

还尝试了原始字符串:load_data_statement = r"""load data local infile 'tgt_metadata_%s.txt' INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '\'';""" % metadata_filename

还尝试了原始字符串:load_data_statement = r"""load data local infile 'tgt_metadata_%s.txt' INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '\'';""" % metadata_filename

并尝试添加额外的转义:还尝试了原始字符串:load_data_statement = r"""load data local infile 'tgt_metadata_%s.txt' INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '\\'';""" % metadata_filename

还尝试了原始字符串:load_data_statement = r"""load data local infile \'tgt_metadata_%s.txt\' INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '\'';""" % metadata_filename

执行行很简单`cur.execute(load_data_statement)

我得到的错误很奇怪:`pymysql.err.ProgrammingError:(1064,“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册以获取正确的语法以在附近使用'tgt_metadta_mal.txt'.txt' INTO table tgt_metadata FIELDS TERMINATED BY ','; ENC' at line 1")

我不明白为什么消息以 'tgt_metadata_mal.txt 开头,并且只显示 ENCLOSED BY... 的前 3 个字母

【问题讨论】:

  • MySQL 抛出的错误是什么?
  • @abukaj 我对 SQL 语句做了误读。反斜杠正确地用作转义字符。

标签: python mysql escaping load-data-infile pymysql


【解决方案1】:

我认为问题出在您打印的 SQL 语句上。 ''' 中的单引号应转义:'\''。您的反斜杠在 Python 级别而不是 MySQL 级别转义引号。因此 Python 字符串应该以 ENCLOSED BY '\\''; 结尾

您也可以使用原始字符串文字表示法: r"""INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '\'';"""

【讨论】:

    【解决方案2】:

    无需转义该字符串。

    cursor.execute("SELECT * FROM Codes WHERE ShortCode = %s", text)

    您应该使用%s 而不是您的字符串,然后(在本例中为文本)将是您的字符串。这是防止SQL Injection的最安全方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-04
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多