我对数据库的mysql用户有所有优先权,但仍然低于错误
[学说\ DBAL \ DBALException]
执行'LOAD DATA LOCAL INFILE'/tmp/uk_insiders/tfo.uktrades_transaction_code.out'时发生异常IGNORE INTO TABLE uktrades_transaction_codes FIELDS TERMINATED BY'|' (id,description)':警告:PDOStatement :: execute():在/Symfony/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php第138行中禁止加载数据本地INFILE
[Symfony的\元器件\调试\异常\ ContextErrorException]
警告:PDOStatement :: execute():在/Symfony/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php第138行中禁止加载数据本地INFILE
答案 0 :(得分:2)
我有同样的问题...... 我通过替换来解决它:
LOAD DATA LOCAL INFILE ...
通过
LOAD DATA INFILE
本地选项: 指定此开关后,将从运行MySQL客户端的主机而不是MySQL服务器读取输入文件。如果未指定此开关,则将从MySQL主机上的数据目录中读取输入文件。要在没有LOCAL开关的情况下使用LOAD DATA,连接的用户必须具有“FILE”权限。(http://geekology.co.za/article/2010/02/how-to-import-or-export-csv-or-text-files-to-from-mysql-databases)
答案 1 :(得分:1)
得到相同的异常消息。 我能够通过使用PDO来实现这一点。
答案 2 :(得分:1)
我曾尝试通过doctrine配置选项参数传递PDO :: MYSQL_ATTR_LOCAL_INFILE参数,但是没有用,这是最终为我工作的解决方案。
$dbhost = $this->getContainer()->getParameter('database_host');
$dbuser = $this->getContainer()->getParameter('database_user');
$dbpass = $this->getContainer()->getParameter('database_password');
$connParams = $em->getConnection()->getParams();
$pdoConn = new \PDO('mysql:host=' . $dbhost . ';dbname=' . $connParams['dbname'], $dbuser, $dbpass, array(
\PDO::MYSQL_ATTR_LOCAL_INFILE => true
));
$sql = "SET FOREIGN_KEY_CHECKS=0";
$stmt = $pdoConn->prepare($sql);
$stmt->execute();
$sql = "LOAD DATA LOCAL INFILE '$file' IGNORE INTO TABLE $tablename FIELDS TERMINATED BY '|' $columns";
$stmt = $pdoConn->prepare($sql);
$stmt->execute();
答案 3 :(得分:0)
两个有效的答案是解决方法:
第三个干净的解决方案是在Doctrine中启用LOCAL选项,但这有点棘手:
https://stackoverflow.com/a/24759583/425204
注意:这还要求在服务器上的MySQL配置中启用LOCAL:my.cnf
答案 4 :(得分:0)
要在Symfony中为PDO对象启用PDO::MYSQL_ATTR_LOCAL_INFILE
选项,我们可以将其添加到yml配置中:
# Doctrine Configuration
doctrine:
dbal:
driver: pdo_mysql
options:
!php/const PDO::MYSQL_ATTR_LOCAL_INFILE: true
# Skip the rest
还要注意如何在yml文件中引用PHP常量,并且该格式用于Symfony 3.4。对于旧版本,请查看Symfony doc。