我正在尝试使用Python pyodbc以编程方式将数据导入Amazon RDS MySQL 8.0.13实例。
当我通过SQLYog运行以下代码时,它运行完美。
LOAD DATA LOCAL INFILE 'D:/path/to/my/files/myfile.csv' IGNORE INTO TABLE my_table
FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
但是,当我使用MySQL Workbench或通过Python在同一台计算机上运行它时,出现错误:
错误1148。此MySQL版本不允许使用命令
我猜这与我的连接字符串或ODBC驱动程序有关。
有人可以告诉我此命令在通过一个客户端(SQLYog)可以通过另一个客户端(MySQL Workbench / Python)正常工作的地方是否存在任何已知错误。
谢谢
答案 0 :(得分:0)
好的-我找到了答案。
似乎连接选项local_infile = 1仅适用于Python中的某些连接。
我仍然找不到如何为MySQL Workbench或pyodbc启用local_infile = 1的方法,但是模块pymysql允许该选项。
import pymysql
try:
my_conn = pymysql.connect(
host='myserver',
port=3306,
db='mydatabase',
user='myuser',
password='somethingsecret',
local_infile=1
)
my_cursor = my_conn.cursor()
my_cursor.execute("LOAD DATA LOCAL INFILE 'D:/path/to/my/files/myfile.csv' IGNORE INTO TABLE my_table FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\\r\\n")
my_conn.commit()
except pymysql.Error as msg:
exit(print(msg))
答案 1 :(得分:0)
从MySQL Workbench运行命令时遇到同样的问题。
默认情况下,对于在RDS实例中运行的任何MySQL服务器,此选项都设置为1。
也可以使用以下命令从MySQL Workbench进行设置:
SET GLOBAL local_infile = 1;
无论如何,很高兴您能够使用Python以编程方式执行此操作。
但是,由于最新版本的错误,设置此选项后无法从MySQL Workbench加载数据。
How to solve Error 1148 from MySql workbench and not cmd?
一种解决方法是从命令行通过传递主机名,用户名和密码来连接到MySQL服务器。
然后,在命令行中执行命令以从MySQL客户端加载文件。
LOAD DATA LOCAL INFILE 'D:/path/to/my/files/myfile.csv' IGNORE INTO TABLE my_table
FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'