我正在使用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)
有人可以帮助我了解这两种机制之间的区别吗?
答案 0 :(得分:1)
原因是这些机制使用不同的驱动程序。
在SQLAlchemy中,您似乎正在使用pymysql engine,后者使用PyMySQL Connection class创建数据库连接。如果要使用local_infile
命令,则要求用户明确传递LOAD DATA LOCAL
参数。
另一个示例使用MySQLdb,它基本上是MySQL C API的包装器(据我所知,不是官方的连接库;那是MySQL Connector Python,它也可以在SQLAlchemy上使用: mysqlconnector)。显然,这是通过默认启用LOAD DATA LOCAL
的方式来创建连接的。