Python/MySQL - 加载数据本地文件

Posted

技术标签:

【中文标题】Python/MySQL - 加载数据本地文件【英文标题】:Python/MySQL - LOAD DATA LOCAL INFILE 【发布时间】:2014-10-23 17:52:34 【问题描述】:

我正在使用 Python 的 mysql 连接器,我正在尝试通过 Python (Windows) 运行以下 SQL 语句 - 这是一个 .csv 文件:

sql1 = ('SET GLOBAL local_infile = "ON";')
cursor.execute(sql1)

sql2 = ('LOAD DATA LOCAL INFILE "' + path[1:-1] + '" INTO TABLE mytable COLUMNS  TERMINATED BY "," LINES TERMINATED BY "\\r\\n" (COL0, COL1, COL2, COL3, COL4, COL5, COL6) SET COL7 = "'some_data'";')
cursor.execute(sql2)

但是当我尝试执行时,我收到以下异常:

1148 (42000): 此 MySQL 版本不允许使用的命令

如果我尝试在 mysql 控制台上执行 LOAD DATA LOCAL INFILE,一切运行正常。

【问题讨论】:

哪个命令有问题? sql1 还是 sql2? 【参考方案1】:

默认情况下,使用 Connector/Python 禁用加载数据 Infile 在创建连接时设置 LOCAL_FILES 客户端标志,如下所示:

from mysql.connector.constants import ClientFlag
conn = mysql.connector.connect(...., client_flags=[ClientFlag.LOCAL_FILES])

【讨论】:

它确实有效。我试过一次,但我忘了添加导入。【参考方案2】:

LOAD DATA存在很多安全问题,所以服务器真的很挑剔。你登录的是localhost,而不是服务器的公网IP?通常一个 IP 会被授予LOAD DATA,但另一个不会。

见the fine manual

【讨论】:

【参考方案3】:

您可以遍历文件的每一行,将每一行作为一行插入。这很容易,因为您已经提到每一列由, 划定,每一行由换行符划定。

例如,假设您的表 mytable 有 8 个字符串列,(COL0 到 COL7):

input_file = open(path[1:-1], 'r')

#Loop through the lines of the input file, inserting each as a row in mytable
for line_of_input_file in input_file:
    values_from_file = line_of_input_file.split(',', 1) #get the columns from the line read from the file

    if(len(values_from_file) == 7): #ensure that 7 columns accounted for on this line of the file
        sql_insert_row = "INSERT INTO mytable VALUES (" + values_from_file[0] + "," + values_from_file[1] + "," + values_from_file[2] + "," + values_from_file[3] + "," + values_from_file[4] + "," + values_from_file[5] + "," + values_from_file[6] + "," + some_data + ");"
        cursor.execute(sql_insert_row)
input_file.close()

【讨论】:

执行INSERT 需要很长时间。我必须插入数千个寄存器。这就是我选择LOAD DATA的原因。【参考方案4】:

使用 MySQLdb 驱动程序:

import MySQLdb
from MySQLdb.constants import CLIENT

然后与MySQLdb.connect() 的其他参数一起,传递client_flag=CLIENT.LOCAL_FILES

通过研究来源,然后尝试发现。

【讨论】:

以上是关于Python/MySQL - 加载数据本地文件的主要内容,如果未能解决你的问题,请参考以下文章

sql 加载数据本地文件

怎么用WebView加载本地html

iOS WebView 加载本地资源(图片,文件等)

Select2 从本地 json 文件加载数据

如何从本地 JSON 文件将数据加载到 ViewController [关闭]

getJSON 在 chrome 上本地加载 json 数据文件时出错 [重复]