为什么要在sqlalchemy中设置local\u infle=1来加载本地文件?sqlalchemy中不允许加载文件的问题

insrf1ej  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(360)

我正在使用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)

有人能帮我理解这两种机制的区别吗?

dldeef67

dldeef671#

原因是这些机制使用不同的驱动程序。在sqlalchemy中,您似乎在使用pymysql引擎,它使用pymysql连接类来创建db连接。这需要用户显式地传递 local_infile 如果要使用 LOAD DATA LOCAL 命令。
另一个例子使用mysqldb,它基本上是mysql c api的 Package 器(据我所知,不是官方的连接库;这将是mysql连接器python,它在sqlalchemy上也可用作mysqlconnector)。这一个显然以一种 LOAD DATA LOCAL 默认情况下启用。

相关问题