Doctrine DBAL和LOAD DATA LOCAL INFILE

时间:2016-04-25 18:00:48

标签: php mysql doctrine

我的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

1 个答案:

答案 0 :(得分:0)

这似乎是一个常见问题。 我猜这是因为各种应用程序建立了与mysql服务器的连接不同的事实(无论它们都使用相同的驱动程序)。根据具体的用例,解决方案将是以下之一:

  1. 如果可以,请尝试使用LOAD DATA INFILE(否LOCAL)。这有一个共同的先决条件:

    • 最好将您的mysql服务器安装在与客户端相同的计算机上。
    • 如果你在Linux上,你应该配置Apparmour以允许mysqld acceess到文件系统中存储数据源文件的位置(/etc/apparmor.d/usr.sbin.mysqld,然后重新加载apparmor)。您还必须将FILE权限授予mysql用户。
  2. 如果你知道LOAD DATA INFILE不是一个选项而你需要LOCAL,你可以尝试直接通过直接与PDO建立的连接在程序中执行查询,请参见:{ {3}}。还要记住,运行mysql客户端的用户应该对您尝试加载的文件具有读访问权。

  3. 您还可以尝试通过Doctrine DBAL与(遗憾的是)没有很好记录的选项“\ PDO :: MYSQL_ATTR_LOCAL_INFILE”建立客户端连接(请参阅此处https://stackoverflow.com/a/18459367