Мне было поручено создать файлы pg_dump для базы данных, в которой есть более 50 таблиц. Я знаю, как сделать это вручную через командную строку psql, но я считаю, что должен быть более быстрый способ, чем делать каждый из них вручную. Любые предложения о том, как это программно? Например, может ли сценарий Perl вызывать pg_dump?
3 ответа
Если я правильно понимаю ваш вопрос, то следующего сценария Bash должно быть достаточно:
#!/bin/bash
for table in `psql -Atc "\dt" | cut -d '|' -f2`
do
pg_dump -Fp -t $table -f $table.dump;
done
Он получает список всех таблиц в некоторой базе данных и выполняет pg_dump -t
для каждой из них.
Вот эквивалент Perl, если хотите:
#!/usr/bin/perl
@tables = qx/psql -Atc "\\dt" | cut -d '|' -f2/;
foreach (@tables)
{
chomp($_);
system("pg_dump -Fp -t $_ -f $_.dump");
}
Если ваши таблицы организованы в различные схемы, то, возможно, вам подойдет следующее:
#!/usr/bin/env perl
use strict;
use warnings;
my $database_name = 'book_library';
my $query = <<"EOT";
SELECT n.nspname as table_schema,
c.relname as table_name
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
AND n.nspname NOT LIKE '^pg_%'
;
EOT
$query =~ s/\n\s*/ /g;
my @results = `echo "$query" | psql -At $database_name`;
foreach (@results) {
chomp;
my ($schema, $table) = split /\|/, $_;
next unless ($schema && $table);
my $cmd = "pg_dump -U postgres -Fp -t $schema.$table -f $schema.$table.dump $database_name";
system($cmd);
}
Обратите внимание, что вам нужно будет установить переменную $ database_name соответствующим образом, и предполагается, что вы используете файл .pgpass.
Pg_dumpall - это инструмент для дампа всей вашей базы данных
http://www.postgresql.org/files/documentation/books/aw_pgsql/node265.html
Похожие вопросы
Новые вопросы
perl
Perl - это процедурный высокоуровневый динамический язык программирования общего назначения, известный своей собственной поддержкой регулярных выражений и возможностей синтаксического анализа строк. Пожалуйста, используйте этот тег для вопросов о Perl в целом. Для вещей, связанных с новым (но связанным) языком Raku (ранее «Perl 6»), используйте тег raku. Для регулярных выражений в стиле Perl на других языках используйте тег regex или, если они основаны на библиотеке PCRE, тег pcre.