【问题标题】:how to do LOAD DATA LOCAL INFILE in laravel 5.4如何在 laravel 5.4 中加载数据本地文件
【发布时间】:2021-08-10 10:20:10
【问题描述】:

我需要在 laravel 5.4 中转换以下查询

$loadDataToTempTableSql = "LOAD DATA LOCAL INFILE '".$filename."' INTO TABLE ABC FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r' IGNORE 1 LINES";
                    $loadDataToTempTableRes = mysqli_query($link,$loadDataToTempTableSql);

                    $loadedData = mysqli_affected_rows($link);

我做了什么

第一步:

DB::select($load_data_to_temp_table_sql);

这是抛出异常:

SQLSTATE[HY000]:一般错误:2014 无法执行查询,而 其他无缓冲查询处于活动状态。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只是 要针对 mysql 运行,您可以通过设置启用查询缓冲 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性。 (SQL:加载数据 本地文件 '/库/WebServer/Documents/public/abc copy.csv' INTO TABLE ABC FIELDS TERMINATED BY ',' 可选地由 '"' 包围的行由 ' 终止 ' 忽略 1 行)

第二步:

$pdo = DB::connection()->getPdo();
$pdo->exec($load_data_to_temp_table_sql);

再次例外:

PDO::exec(): LOAD DATA LOCAL INFILE 禁止

请指导,怎么办?

【问题讨论】:

    标签: laravel-5.4 mysql-5.5


    【解决方案1】:

    我也遇到过同样的问题,谷歌搜索后现在已经解决了。您应该将以下内容添加到您的 mysql/my.cnf 文件中:

    [Server]
    local_infile=true
    

    然后将'options' => array(PDO::MYSQL_ATTR_LOCAL_INFILE => true) 添加到项目的config/database.php 文件中。

    现在从 cmd/终端重新启动您的 MySQL。运行LOAD DATA LOCAL INFILE 就可以了。如果还有问题,可以访问https://tenerant.com/blog/using-load-data-local-infile-in-a-laravel-migration/

    【讨论】:

      【解决方案2】:

      我没有与 DB 合作。我使用 PDO 解决了问题,然后我必须在 config 文件夹中的 database.php 文件中添加 MYSQL_ATTR_LOCAL_INFILE

      'options' => [PDO::MYSQL_ATTR_LOCAL_INFILE => true],
      

      【讨论】:

        【解决方案3】:

        以下是您的解决方案:

        转到/打开配置文件config/database.php

        connections => mysql 数组上添加以下行以启用本地文件。

        // config/database.php
        ...
        ...
        'mysql' => [
            ...
            ...
            'driver' => 'mysql',
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
                PDO::MYSQL_ATTR_LOCAL_INFILE => true, // this must be true
            ]) : [],
        ],
        

        重启服务器并清除配置和缓存:

        php artisan config:clear

        php artisan cache:clear

        php artisan serve

        它,现在你去。

        【讨论】:

          【解决方案4】:

          如果您使用 ubuntu 或带宅基地的虚拟盒子服务器,请填写:

          在您的根宅基地(带有 vagrant 文件)文件夹中:

          流浪的ssh

          编辑文件: sudo nano /etc/apparmor.d/usr.sbin.mysqld

          找到:

          允许数据文件目录访问

          并添加这一行:

          /home/Code/NameOfyourProject/public/[上传文件夹的名称]/* rw

          保存

          然后:

          sudo service apparmor 重启

          【讨论】:

            猜你喜欢
            • 2017-09-04
            • 1970-01-01
            • 1970-01-01
            • 2017-08-24
            • 2018-12-19
            • 1970-01-01
            • 2018-11-26
            • 1970-01-01
            • 2017-08-14
            相关资源
            最近更新 更多