【发布时间】: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