执行'LOAD DATA LOCAL INFILE时发生异常

时间:2013-08-20 06:45:21

标签: mysql symfony doctrine-orm load-data-infile

我对数据库的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

5 个答案:

答案 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)

两个有效的答案是解决方法:

  • 接受的答案建议使用PDO连接
  • 另一个答案建议删除LOCAL关键字,但并不总是可以

第三个干净的解决方案是在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