Python执行MySQL LOAD DATA导入CSV时OPTIONALLY ENCLOSED BY触发语法错误如何解决
问题原因
你对问题的判断完全正确:字符串内部未转义的双引号被Python识别为了整个SQLCMD字符串的闭合标记,导致后续代码的语法解析全部错乱,最终触发续行符后存在非法字符的报错。以下是可直接落地的解决方案:
解决方案
方案1:使用三引号包裹SQL字符串(最推荐)
三原生支持多行字符串格式,无需手动添加行续行符\,内部的单、双引号都会被识别为普通字符无需额外转义。搭配原始字符串前缀r还可以避免\n被Python提前转义为实际换行符,更符合MySQL语法要求:
SQLCMD = r"""LOAD DATA INFILE '/Users/v***/MySQLfiles/salaries.csv' INTO TABLE salaries.salaries FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS"""
写完可直接执行print(SQLCMD)验证输出的SQL语句是否和预期完全一致。
方案2:转义内部双引号
如果坚持用单组双引号包裹整个SQL字符串,需要在内部的双引号前添加转义符\,同时注意每行末尾的续行符\后不能有空格、注释等任何多余字符:
SQLCMD = "LOAD DATA INFILE '/Users/v***/MySQLfiles/salaries.csv' \ INTO TABLE salaries.salaries \ FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' \ LINES TERMINATED BY '\\n' \ IGNORE 1 ROWS"
方案3:切换外层字符串的引号类型
改用单引号包裹整个SQL字符串,此时内部的双引号会被识别为普通字符,仅需要转义路径中出现的单引号即可:
SQLCMD = 'LOAD DATA INFILE \'/Users/v***/MySQLfiles/salaries.csv\' \ INTO TABLE salaries.salaries \ FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'"\' \ LINES TERMINATED BY \'\\n\' \ IGNORE 1 ROWS'
内容的提问来源于stack exchange,提问作者Bean Huang
相关产品推荐
相关产品推荐

