我的MySql服务器和客户端都使用local-infile=1运行。这使我可以执行如下查询:

LOAD DATA LOCAL INFILE /var/data/report.csv INTO TABLE MyTable FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 2 LINES (column1, column2, column3)';

当我从命令行登录到MySql服务器然后执行查询时,一切都很好。

但是,当我想对使用Doctrine DBAL和db.driver: pdo_mysql连接到同一数据库的应用程序执行相同的查询时,出现此错误:


  语法错误或访问冲突:1148此MySQL版本不允许使用的命令


似乎我的mysql客户端和服务器(local-infile=1)设置不受Doctrine DBAL的“尊重”。客户端和数据库主机允许时,应用程序的连接不允许LOAD DATA LOCAL INFILE。这是为什么?如何配置数据库连接以执行LOAD DATA LOCAL INFILE

最佳答案

看来这是一个普遍的问题。
我想这是由于各种应用程序以不同的方式建立了与mysql服务器的连接(无论它们都可能使用相同的驱动程序)。根据特定的用例,解决方案将是以下之一:


如果可能,请尝试使用LOAD DATA INFILE(不使用LOCAL)。要满足此要求,必须满足一些先决条件:


最好将mysql服务器与客户端安装在同一台计算机上。
如果您使用的是Linux,则应将Apparmour配置为允许mysqld访问文件系统中存储数据源文件的位置(/etc/apparmor.d/usr.sbin.mysqld,然后重新加载apparmor)。您还必须将FILE特权授予mysql用户。

如果您知道不是LOAD DATA INFILE选项并且需要LOCAL,则可以尝试通过直接与PDO建立的连接在程序中直接执行查询,请参见此处:https://stackoverflow.com/a/18459367。还请记住,您正在运行mysql客户端的用户应具有对您尝试加载的文件的读取权限。
您也可以尝试通过Doctrine DBAL使用(不幸的是)没有详细记录的选项“ \ PDO :: MYSQL_ATTR_LOCAL_INFILE”建立客户端连接(请参见https://stackoverflow.com/a/24759583

关于php - Doctrine DBAL和LOAD DATA LOCAL INFILE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36847842/

10-09 18:15
查看更多