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

115

У меня есть схема базы данных с именем: 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, но я не могу найти способ сделать это.

  • 2
    Вы можете пропустить операторы INSERT и просто скопировать, используя SELECT, непосредственно между базами данных. albertech.blogspot.com/2016/11/...
  • 0
    PostgreSQL не может выбирать между базами данных. По крайней мере, старые версии не могут и не могут Greenplum, не знаю о 9.x.
Теги:
export
insert
postgresql-copy
sql-scripts

8 ответов

180
Лучший ответ

Создайте таблицу с набором, который хотите экспортировать, а затем используйте утилиту командной строки 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 не сбрасывать схему.

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

  • 3
    Хорошо, пока ваше решение работает. Одна вещь, пропущенная, мне нужно добавить "-U user_name". Я также почти преуспел с инструментом ToraSQL, просто он имеет ошибку в данных даты и времени в результате скрипта. Если никто не сможет предложить решение GUI через 2 дня, ваш ответ будет принят
  • 2
    Просто хотите поделиться с другими людьми, вы также можете использовать этот бесплатный инструмент с графическим интерфейсом: SQL Workbench / J (с драйвером jdbc4 postgreSQL), чтобы сделать то же самое.
Показать ещё 9 комментариев
113

Для экспорта данных используйте 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.

  • 7
    OP вызывает специально для данных как файл сценария вставки SQL . Я предполагаю, что он говорит о командах insert , не так ли?
  • 1
    @Clodoaldo: Вы можете быть правы, в этом случае ваш ответ будет лучше. Можно также скопировать скрипт CREATE в pgAdmin отдельно (так как OP упоминает GUI).
Показать ещё 4 комментария
8

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

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

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

Изображение 5103

Изображение 5104

Изображение 5105

Изображение 5106

  • 0
    Когда я делаю это, нет никакой опции "Bakckup". Это pgAdmin III v1.18.1, подключающийся к Greenplum 4.3.4.1 (на основе PostgreSQL 8.2.15).
  • 0
    Я установил pgAdmin III v1.18.1 и там была опция «резервное копирование». Я подключился к PostgreSQL 9.5. Таким образом, проблема, скорее всего, существует между pgAdmin и Greenplum.
8

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

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

  • 1
    Работает отлично. Когда вы выбираете «postgres» в качестве «драйвера», вероятно, вам придется самостоятельно загрузить драйверы JDBC: jdbc.postgresql.org/download.html (это файл .jar - двоичный файл java) и добавить его в качестве «драйвер» соединения postgresql. Строка подключения (или URL как в интерфейсе) должна выглядеть следующим образом: jdbc: postgresql: //127.0.0.1: 5432 / db_name
  • 0
    DBVisualizer имеет аналогичную и отличную функцию, которая может копировать в файл или прямо в буфер обмена.
3

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

pg_dump -U user_name --data-only --column-inserts -t nyummy.cimory | grep "tokyo" > tokyo.sql
  • 2
    Нужно подумать о том, чтобы иметь «Токио» в другой области.
  • 0
    @BuyutJokoRivai, так как это дамп только таблицы, в большинстве случаев все должно быть хорошо
Показать ещё 2 комментария
1

Я просто постучал по быстрой процедуре, чтобы сделать это. Он работает только для одной строки, поэтому я создаю временное представление, которое просто выбирает нужную строку, а затем заменяет 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.

1

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

CREATE VIEW foo AS
SELECT id,name,city FROM nyummy.cimory WHERE city = 'tokyo'
  • 2
    Я пробовал это в pgAdmin III, но для объекта View нет никакой опции для дампа.
  • 0
    Попробуй навикать. Я использую его, и у него есть опция экспорта сценария SQL
Показать ещё 3 комментария
-1

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

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

pg_dump -t view_name DB_name > db.sql

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

  • 0
    Это будет экспортировать только оператор create view

Ещё вопросы

Сообщество Overcoder
Наверх
Меню