У меня есть схема базы данных с именем: 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, но я не могу найти способ сделать это.
Создайте таблицу с набором, который хотите экспортировать, а затем используйте утилиту командной строки 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
не сбрасывать схему.
Как указано ниже, создание представления вместо таблицы приведет к исключению создания таблицы всякий раз, когда необходим новый экспорт.
Для экспорта данных используйте 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.
insert
, не так ли?
Это простой и быстрый способ экспортировать таблицу в script с помощью pgAdmin вручную без дополнительных установок:
Этот метод также работает с техникой создания export_table, как показано в ответе @Clodoaldo Neto.
SQL Workbench имеет такую функцию.
После запуска запроса щелкните правой кнопкой мыши на результатах запроса и выберите "Копировать данные как SQL > SQL Insert"
Для моего варианта использования я смог просто подключиться к grep.
pg_dump -U user_name --data-only --column-inserts -t nyummy.cimory | grep "tokyo" > tokyo.sql
Я просто постучал по быстрой процедуре, чтобы сделать это. Он работает только для одной строки, поэтому я создаю временное представление, которое просто выбирает нужную строку, а затем заменяет 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.
Вы можете просмотреть таблицу с конкретными записями, а затем выгрузить файл sql
CREATE VIEW foo AS
SELECT id,name,city FROM nyummy.cimory WHERE city = 'tokyo'
попробовал в pgadmin выполнение запроса с опцией " EXECUTE QUERY WRITE RESULT TO FILE "
его только экспортировать данные, иначе попробуйте
pg_dump -t view_name DB_name > db.sql
-t используется для == > Только таблицы таблиц (или представлений или последовательностей) дампа, refer
create view