簡體   English   中英

Python/MySQL - 加載數據本地 INFILE

[英]Python/MySQL - LOAD DATA LOCAL INFILE

我正在為 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,一切運行正常。

在創建連接集 LOCAL_FILES 客戶端標志時,默認情況下使用連接器/Python 禁用加載數據文件,如下所示:

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

LOAD DATA存在很多安全問題,因此服務器非常挑剔。 你登錄的是localhost,不是服務器的public IP? 通常一個 IP 將被授予LOAD DATA ,但另一個不會。

精美說明書

您可以遍歷文件的每一行,將每一行作為一行插入。 這很容易,因為您已經提到每一列都用 划定,每一行都用換行符划定。

例如,假設您的表 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()

使用 MySQLdb 驅動程序:

import MySQLdb
from MySQLdb.constants import CLIENT

然后連同其他 arguments 到MySQLdb.connect() ,傳遞client_flag=CLIENT.LOCAL_FILES

通過研究來源發現,然后嘗試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM