【问题标题】:mysql.connector.errors.ProgrammingError: 1083 (42000): Field separator argument is not what is expectedmysql.connector.errors.ProgrammingError: 1083 (42000): 字段分隔符参数不是预期的
【发布时间】:2017-04-22 21:48:16
【问题描述】:

当我使用 Jupyter notebook (Python) 使用 mysql.connector 连接 MySQL 并将 csv 文件加载到数据库中时,创建游标后,我尝试了:

    self.cursor.execute("LOAD DATA LOW_PRIORITY LOCAL INFILE 'deficiency.csv' \
    REPLACE INTO TABLE retailstore.deficiency CHARACTER SET utf8 \
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\r\n' \
    IGNORE 1 LINES")

我收到错误消息“mysql.connector.errors.ProgrammingError: 1083 (42000): Field separator argument is not what is expected; check the manual”。

当我直接在 MySQL 中使用完全相同的 sql 查询来加载 csv 文件时,它可以工作,而在 Python 中却失败了。

有人可以帮我找出问题所在吗?谢谢!

【问题讨论】:

    标签: python mysql csv mysql-connector-python


    【解决方案1】:

    在将它传递给self.cursor.execute 之前,您是否尝试过printing 尝试运行的SQL 字符串?

    如果你这样做,你会得到这个输出:

    LOAD DATA LOW_PRIORITY LOCAL INFILE 'deficiency.csv'     REPLACE INTO TABLE retailstore.deficiency CHARACTER SET utf8     FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY ' ESCAPED BY ' LINES TERMINATED BY '
    '     IGNORE 1 LINES
    

    仔细看一下,你会注意到一些关于它的事情:

    • OPTIONALLY ENCLOSED BYESCAPED BY 后面只有 ',而不是 '"',如您所料,
    • TERMINATED BY ' 后面有一个换行符。

    要修复它,您需要转义OPTIONALLY ENCLOSED BYESCAPED BY 之后的双引号字符,以及\r\n 中的反斜杠:

    self.cursor.execute("LOAD DATA LOW_PRIORITY LOCAL INFILE 'deficiency.csv' \
    REPLACE INTO TABLE retailstore.deficiency CHARACTER SET utf8 \
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\\r\\n' \
    IGNORE 1 LINES")
    

    或者,如果您使用三引号原始字符串,则不需要转义 \r\n 中的双引号字符和反斜杠,也不需要每行末尾的尾随反斜杠:

    self.cursor.execute(r"""LOAD DATA LOW_PRIORITY LOCAL INFILE 'deficiency.csv'
        REPLACE INTO TABLE retailstore.deficiency CHARACTER SET utf8
        FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\r\n'
        IGNORE 1 LINES""")
    

    您可能想知道为什么您的原始代码会生成它所生成的输出。原因是您实际上有三个彼此相邻的字符串文字。其中之一是

    "LOAD DATA LOW_PRIORITY LOCAL INFILE 'deficiency.csv' \
        REPLACE INTO TABLE retailstore.deficiency CHARACTER SET utf8 \
        FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"
    

    下一个是

    ' ESCAPED BY '
    

    (Python中的字符串字面量可以用'"包围)最后一个是

    "' LINES TERMINATED BY '\r\n' \
    IGNORE 1 LINES"
    

    如果你将两个字符串文字并排放置,Python 会将它们连接在一起:

    >>> print("12"'34'"56")
    123456
    

    【讨论】:

    • 谢谢!我尝试了修改后的代码,但它返回了另一条错误消息:“mysql.connector.errors.DatabaseError: 1205 (HY000): Lock wait timeout exceeded; try restarting transaction”...您能提供任何线索吗?
    • @Ramona:抱歉,不,我之前没有收到过这条消息。
    猜你喜欢
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2022-09-29
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多