почему мы должны установить local_infile = 1 в sqlalchemy для загрузки локального файла? Загрузка файла не разрешена проблема в sqlalchemy - PullRequest
0 голосов
/ 06 ноября 2018

Я использую sqlalchemy для подключения к базе данных MySQL и обнаружил странное поведение. Если я сделаю запрос

LOAD DATA LOCAL INFILE 
'C:\\\\Temp\\\\JaydenW\\\\iata_processing\\\\icer\\\\rename\\\\ICER_2017-10- 
12T09033
7Z023870.csv    

Появляется ошибка:

sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1148, u'The used 
command is not allowed with this MySQL versi
on') [SQL: u"LOAD DATA LOCAL INFILE 
'C:\\\\Temp\\\\JaydenW\\\\iata_processing\\\\icer\\\\rename\\\\ICER_2017-10- 
12T090337Z023870.csv' INTO TABLE genie_etl.iata_icer_etl LINES TERMINATED BY 
'\\n' 
IGNORE 1 Lines   (rtxt);"] (Background on this error at: 
http://sqlalche.me/e/2j85)

И я нахожу причину в том, что: Мне нужно установить параметр как

args = "mysql+pymysql://"+username+":"+password+"@"+hostname+"/"+database+"? 
local_infile=1"

Если я использую официальную библиотеку подключений MySQL. Мне не нужно это делать.

myConnection = MySQLdb.connect(host=hostname, user=username, passwd=password, db=database)

Может кто-нибудь помочь мне понять разницу между этими двумя механизмами?

1 Ответ

0 голосов
/ 06 ноября 2018

Причина в том, что механизмы используют разные драйверы. В SQLAlchemy вы, похоже, используете движок pymysql , который использует класс PyMySQL Connection для создания соединения с БД. Для этого требуется, чтобы пользователь явно передавал параметр local_infile, если он хочет использовать команду LOAD DATA LOCAL.

В другом примере используется MySQLdb , который в основном является оболочкой для MySQL C API (и, насколько мне известно, не официальная библиотека соединений; это будет MySQL Connector Python , который также доступен в SQLAlchemy как mysqlconnector ). Этот, очевидно, создает соединение таким образом, что LOAD DATA LOCAL включен по умолчанию.

...