【Laravel】mysqlのCSVインポートでエラー

Laravelで、mysqlにCSVファイルをインポートしようとしたら
エラーになったので、そのときの対応をメモメモ

CSVの読み込みはこんな感じ

  DB::statement('LOAD DATA LOCAL INFILE "/tmp/sample.csv" INTO TABLE sampleTable FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'"\'');

そうすると
こんなエラーや
string(420) “SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

こんなエラーで怒られる、、、
PDO::exec(): LOAD DATA LOCAL INFILE forbidden

コンソール画面から直接SQLを実行するといけるのに

config/database.php に
下記2行を追加してあげたらうまくいった
PDO::ATTR_EMULATE_PREPARES => true,
PDO::MYSQL_ATTR_LOCAL_INFILE => true,

        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', 'xxx.xxx.xxx.xxx'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'xxxxx'),
            'username' => env('DB_USERNAME', 'xxxxx'),
            'password' => env('DB_PASSWORD', 'xxxxx'),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
                PDO::ATTR_EMULATE_PREPARES => true,
                PDO::MYSQL_ATTR_LOCAL_INFILE => true,
            ]) : [],
        ],

コメント

タイトルとURLをコピーしました