Как загрузить CSV на PostgreSQL таблицу в Heroku? - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть базовый c веб-сайт, использующий PHP и PostgreSQL в качестве серверной части в Heroku. Мне нужно, чтобы пользователи загружали CSV в таблицу в Postgres. Поскольку Heroku имеет временную файловую систему (не может создавать или изменять файлы на сервере), я пытаюсь найти работоспособный способ достижения этой цели.

Я пробовал различные методы (COPY, / copy, pg_put_line ( ), pq_query (), pg_prepare () / pg_execute () и др. c.) без успеха. Моя текущая итерация:

  • HTML тип ввода файла на веб-странице для пользователя, чтобы просмотреть / выбрать CSV-файл.
  • Javascript синтаксический анализ массива массивов. Внешний массив строк из CSV, каждая из которых содержит массив значений для этой строки. Затем AJAX вызов PHP, передача массива массивов в качестве параметра.
  • PHP с использованием pg_copy_from () для вставки данных в Postgres

Все это приводит к

PHP Warning:  Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in Unknown on line 0

и

PHP Warning:  pg_copy_from(): Copy command failed: ERROR:  missing data for column "sku"
CONTEXT:  COPY product, line 1: "Array" in /app/upload.php on line 12

Нет ничего уникального в таблице или CSV. Поле «SKU», указанное в сообщении, является вторым столбцом, поэтому оно, кажется, срабатывает немедленно. Следует отметить, что запуск выгрузки непосредственно из командной строки работает как чудо, но это нереальный вариант, когда пользователи подключаются и выполняют такие команды (heroku pg:psql -c "\copy Product (Id,SKU,Name,Active,Status,Quotable,L1,L2,L3,L4,Approval_Matrix) FROM 'E:\local_git\jc-home-dev\chart_data.csv' DELIMITER ',' CSV HEADER;"). Мой супер-упрощенный код:

HTML:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8"/>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
  <script src="upload.js"></script>
  <div>    
    Upload Data:
    <br>
    <input type="file" id="uploadFile" name="uploadFile"
      onchange="uploadFile(this.files[0])" accepts=".csv"/>
  </div>
</body>
</html>

Javascript:

function uploadFile(file) {
    var reader = new FileReader();
    reader.readAsText(file);
    reader.onload = loadHandler;
}

function loadHandler(e) {
    var csv = e.target.result;
    processData(csv);
}

function processData(csv) {
    var allLines = csv.split(/\r\n|\n/);
    var lines = [];
    for (var i=0; i<allLines.length; i++) {
        var data = allLines[i].split(',');
        var tarr = [];
        for (var j=0; j<data.length; j++) {
            tarr.push(data[j]);
        }
        lines.push(tarr);
    }
    loadProduct(lines);
}

function loadProduct(data) {
    console.log(data);

    $.post(
        'upload.php',
        {rows: data},
        function() {
            console.log("Upload complete");
        }
    );
}

PHP:

<?php
require_once 'login.php';
$db_cnxn = pg_connect("
    host=$host
    dbname=$dbname
    user=$user
    password=$password
    port=$port
") or die(
    'Could not connect to database: ' . pg_last_error()
);
pg_copy_from($db_cnxn, "Product", $_POST['rows'], ',');
pg_close($db_cnxn);
?>

Любая помощь будет высоко ценится! Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...