Экспортировать определенные строки из таблицы PostgreSQL как INSERT SQL script

У меня есть схема базы данных с именем: nyummy и таблица с именем cimory:

create table nyummy.cimory (
  id numeric(10,0) not null,
  name character varying(60) not null,
  city character varying(50) not null,
  CONSTRAINT cimory_pkey PRIMARY KEY (id)
);

Я хочу экспортировать данные таблицы cimory в виде файла SQL script. Тем не менее, я хочу только экспортировать записи/данные, где город равен "tokyo" (предполагают, что данные города имеют строчные буквы).

Как это сделать?

Не имеет значения, находится ли решение в бесплатных графических инструментах или в командной строке (хотя решение для графических интерфейсов лучше). Я пробовал pgAdmin III, но я не могу найти способ сделать это.

Ответ 1

Создайте таблицу с набором, который хотите экспортировать, а затем используйте утилиту командной строки pg_dump для экспорта в файл:

create table export_table as 
select id, name, city
from nyummy.cimory
where city = 'tokio'
$ pg_dump --table=export_table --data-only --column-inserts my_database > data.sql

--column-inserts будет сбрасываться как команды вставки с именами столбцов.

--data-only не сбрасывать схему.

Как указано ниже, создание представления вместо таблицы приведет к исключению создания таблицы всякий раз, когда необходим новый экспорт.

Ответ 2

Для экспорта данных используйте COPY.
Вы получаете файл с одной строкой таблицы на строку в виде текстовых команд (не INSERT), это меньше и быстрее:

COPY (SELECT * FROM nyummy.cimory WHERE city = 'tokio') TO '/path/to/file.csv';

Импортировать то же самое в другую таблицу той же структуры где угодно:

COPY other_tbl FROM '/path/to/file.csv';

COPY записывает и читает файлы, локальные на сервере, в отличие от клиентских программ, таких как pg_dump или psql, которые читают и записывают файлы, локальные для клиента. Если оба запускаются на одном компьютере, это не имеет большого значения, но это делает для удаленных подключений.

Существует также команда \copy psql, которая:

Выполняет копию интерфейса (клиента). Это операция, которая запускает SQL COPY, но вместо чтения или записи сервера указанный файл, psql читает или записывает файл и маршрутизирует данные между сервером и локальной файловой системой. Это означает, что файл доступность и привилегии являются правами локального пользователя, а не сервер, и не требуется привилегий суперпользователя SQL.

Ответ 3

SQL Workbench имеет такую ​​функцию.

После запуска запроса щелкните правой кнопкой мыши на результатах запроса и выберите "Копировать данные как SQL > SQL Insert"

Ответ 4

Это простой и быстрый способ экспортировать таблицу в script с помощью pgAdmin вручную без дополнительных установок:

  • Щелкните правой кнопкой мыши на целевой таблице и выберите "Резервное копирование".
  • Выберите путь к файлу для хранения резервной копии. В качестве формата выберите "Обычная".
  • Откройте вкладку "Параметры дампа №2" внизу и установите флажок "Использовать вставки столбцов".
  • Нажмите кнопку "Резервное копирование".
  • Если вы откроете результирующий файл с помощью текстового редактора (например, блокнот ++), вы получите script для создания всей таблицы. Оттуда вы можете просто скопировать созданные INSERT-заявления.

Этот метод также работает с техникой создания export_table, как показано в ответе @Clodoaldo Neto.

Щелкните правой кнопкой мыши на целевой таблице и выберите

Выберите путь назначения и измените формат на

Откройте вкладку

Вы можете скопировать инструкции INSERT оттуда.

Ответ 5

Для моего варианта использования я смог просто подключиться к grep.

pg_dump -U user_name --data-only --column-inserts -t nyummy.cimory | grep "tokyo" > tokyo.sql

Ответ 6

Вы можете просмотреть таблицу с конкретными записями, а затем выгрузить файл sql

CREATE VIEW foo AS
SELECT id,name,city FROM nyummy.cimory WHERE city = 'tokyo'

Ответ 7

Я просто постучал по быстрой процедуре, чтобы сделать это. Он работает только для одной строки, поэтому я создаю временное представление, которое просто выбирает нужную строку, а затем заменяет pg_temp.temp_view фактической таблицей, которую я хочу вставить.

CREATE OR REPLACE FUNCTION dv_util.gen_insert_statement(IN p_schema text, IN p_table text)
  RETURNS text AS
$BODY$
DECLARE
    selquery text; 
    valquery text; 
    selvalue text; 
    colvalue text; 
    colrec record;
BEGIN

    selquery := 'INSERT INTO ' ||  quote_ident(p_schema) || '.' || quote_ident(p_table);

    selquery := selquery || '(';

    valquery := ' VALUES (';
    FOR colrec IN SELECT table_schema, table_name, column_name, data_type
                  FROM information_schema.columns 
                  WHERE table_name = p_table and table_schema = p_schema 
                  ORDER BY ordinal_position 
    LOOP
      selquery := selquery || quote_ident(colrec.column_name) || ',';

      selvalue := 
        'SELECT CASE WHEN ' || quote_ident(colrec.column_name) || ' IS NULL' || 
                   ' THEN ''NULL''' || 
                   ' ELSE '''' || quote_literal('|| quote_ident(colrec.column_name) || ')::text || ''''' || 
                   ' END' || 
        ' FROM '||quote_ident(p_schema)||'.'||quote_ident(p_table);
      EXECUTE selvalue INTO colvalue;
      valquery := valquery || colvalue || ',';
    END LOOP;
    -- Replace the last , with a )
    selquery := substring(selquery,1,length(selquery)-1) || ')';
    valquery := substring(valquery,1,length(valquery)-1) || ')';

    selquery := selquery || valquery;

RETURN selquery;
END
$BODY$
  LANGUAGE plpgsql VOLATILE;

Вызывается таким образом:

SELECT distinct dv_util.gen_insert_statement('pg_temp_' || sess_id::text,'my_data') 
from pg_stat_activity 
where procpid = pg_backend_pid()

Я не тестировал это против инъекций, пожалуйста, дайте мне знать, если для этого недостаточно котировки quote_literal.

Также он работает только для столбцов, которые можно просто перевести в:: текст и обратно.

Также это для Greenplum, но я не могу думать о причине, почему он не будет работать на Postgres, CMIIW.

Ответ 8

попробовал в pgadmin выполнение запроса с опцией " EXECUTE QUERY WRITE RESULT TO FILE "

его только экспортировать данные, иначе попробуйте

pg_dump -t view_name DB_name > db.sql

-t используется для == > Только таблицы таблиц (или представлений или последовательностей) дампа, refer