Как я могу разрешить обновление таблиц базы данных через импорт CSV во временную таблицу? - PullRequest
0 голосов
/ 28 октября 2019

Я настраиваю базу данных postgreSQL для компании, чтобы помочь им разобраться в беспорядке файлов Excel с дублированными данными, слишком большим количеством версий и т. Д.

В компании, как правило, есть неопытные пользователи, которые будут отказываться отинтерфейс командной строки. Я предоставляю им достаточно запросов, чтобы можно было выполнить их работу, и я буду писать больше по мере необходимости. Они ожидают, что смогут стать достаточно опытными с PGAdmin 4.

Одной из основных задач будет обновление данных в постоянных таблицах, и им будет наиболее удобно обновлять файлы Excel, преобразовывать их в CSV и выполнять запрос. Я хочу позволить им сделать это, загрузив данные во временную таблицу с помощью команды COPY, а затем с помощью команд INSERT / UPDATE с условиями не перезаписывать / дублировать существующие строки с помощью предложения WHERE.

В двух словахЯ пытаюсь заставить их делать все, что им нужно от PGAdmin 4, и я застрял в той части, где они могут загрузить CSV-файл и обновить таблицы из этого. Пример запроса показан ниже.

Похоже, единственное решение, которое я нашел, - это выполнение / копирование из интерфейса командной строки, которого я пытаюсь избежать.

AWS RDS этого не делаетразрешить предоставление привилегий суперпользователя с созданной мной основной учетной записи. Также я не могу предоставить кому-либо роль pg_read_server_files.

Сначала они загрузят файл в temp_table:

CREATE TEMPORARY TABLE temp_table (
    col1 TEXT,
    col2 TEXT,
    col3 TEXT,
    col4 TEXT,
    col5 TEXT
);

COPY temp_table (col1, col2, col3, col4, col5) FROM 'file_path' WITH DELIMITER ',' CSV HEADER;

Как только данные будут загружены в temp_table, они будут выполняться:

INSERT INTO persistent_table (col1, col2, col3, col4, col5)
SELECT col1, col2, col3, col4, col5 
FROM temp_table 
WHERE col1 NOT IN (SELECT col1 FROM persistent_table);

Первый бит кода дает мне эту ошибку.

ОШИБКА: должен быть суперпользователем или членом роли pg_read_server_files для КОПИРОВАНИЯ из файла
СОВЕТ: Любой можетСкопировать в стандартный вывод или из стандартного ввода. Команда psql \ copy также работает для всех.
Состояние SQL: 42501

1 Ответ

0 голосов
/ 28 октября 2019

pgAdmin4 имеет собственную функцию, аналогичную psql's \ copy, для загрузки данных из файла на стороне клиента. После того, как вы щелкнете правой кнопкой мыши по имени таблицы, появится диалоговое окно импорта / экспорта. Так же, как \ copy, он использует COPY ... FROM STDIN за кулисами. Вы можете думать об этом как о графическом интерфейсе, эквивалентном \ copy, который кажется именно тем, о чем вы просили.

...