【问题标题】:Doctrine DBAL and LOAD DATA LOCAL INFILE原则 DBAL 和 LOAD DATA LOCAL INFILE
【发布时间】:2016-04-25 18:00:47
【问题描述】:

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

【问题讨论】:

    标签: php mysql doctrine


    【解决方案1】:

    这似乎是一个常见问题。 我想这源于不同应用程序建立到 mysql 服务器的连接不同(不管它们都可能使用相同的驱动程序这一事实)。根据特定的用例,解决方案将是以下之一:

    1. 如果可能,请尝试使用LOAD DATA INFILE(不是LOCAL)。要使它起作用,有一个先决条件:

      • 最好将 mysql 服务器与客户端安装在同一台机器上。
      • 如果您使用的是 Linux,您应该配置 Apparmour 以允许 mysqld 访问您的文件系统中存储数据源文件的位置(/etc/apparmor.d/usr.sbin.mysqld,然后重新加载 apparmor)。您还必须向 mysql 用户授予 FILE 权限。
    2. 1234563还要记住,您运行 mysql 客户端的用户应该对您尝试加载的文件具有读取权限。
    3. 您还可以尝试通过 Doctrine DBAL 使用(不幸的是)没有很好记录的选项“\PDO::MYSQL_ATTR_LOCAL_INFILE”建立客户端连接(请参阅此处https://stackoverflow.com/a/24759583

    【讨论】:

      猜你喜欢
      • 2012-10-05
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      相关资源
      最近更新 更多