Python/MySQL - LOAD DATA LOCAL INFILE使用方法

2 投票
4 回答
3441 浏览
提问于 2025-04-18 21:00

我正在使用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,所有操作都正常。

4 个回答

0

使用MySQLdb驱动:

import MySQLdb
from MySQLdb.constants import CLIENT

然后在调用MySQLdb.connect()时,除了其他参数外,还要加上client_flag=CLIENT.LOCAL_FILES

这是通过研究源代码并进行尝试发现的。

0

使用LOAD DATA的时候有很多安全问题,所以服务器会很挑剔。你是在本地登录,而不是通过服务器的公网IP登录吗?通常一个IP地址可能会被允许使用LOAD DATA,而另一个则不行。

可以查看这份详细手册

0

你可以逐行读取文件,把每一行作为一条记录插入。这很简单,因为你已经提到每一列是用,来分隔的,而每一行是用换行符来分开的。

举个例子,假设你的表格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()
4

在使用Connector/Python时,默认情况下是不允许使用“Load Data Infile”这个功能的。如果你想要使用这个功能,在建立连接的时候需要设置一个叫做LOCAL_FILES的客户端标志,方法如下:

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

撰写回答