Я знаю, что это довольно старый вопрос, и в большинстве случаев я согласен с Крисом в том, что это не то, что вы действительно хотели бы делать (поскольку любые внешние ключи будут создавать проблемы, если вы не восстановите таблицы в точном порядке); однако, поскольку это довольно высокий результат в поиске Google по заданному мной вопросу, и никто на самом деле не дал ответа на сам вопрос, это может быть полезно с оговоркой, что вам, вероятно, не следует использовать его, если вы не знаете, что вы' делаешь...
Этот скрипт bash (я не буду называть его однострочным, потому что это не совсем так, хотя он будет работать, если вы просто вставите его в командную строку) выводит список таблиц (для общедоступной схемы) из psql и запускает каждую таблицу отдельно через pg_dump, затем объединяет ограничения в определение основной таблицы, выводя результат каждой таблицы в файл, имя которого основано на имени таблицы.
Вы также можете выбрать SELECT из таблиц схемы, чтобы получить имена таблиц, а не анализировать вывод из \dt; Я считаю, что запомнить, как делать одно, наверное, так же сложно, как и другое.
Это то, что мне было нужно для моего конкретного приложения, я не гарантирую, что это будет работать для вашего (или даже для конкретной версии pg_dump), но у вас не должно возникнуть особых проблем с его модификацией. Конечно, есть лучшие способы сделать вторую часть (вероятно, используя awk), но это было просто и сделало работу. Я игнорирую все, кроме создания таблицы, ограничений и владения; если вы хотите добавить другие строки, вам нужно добавить дополнительные тесты в строку /OWNER TO/...
DB=mydb; s=1; psql -tA -F, -c '\dt public.*' $DB | cut -f2 -d, | while read t ; do
(
rm -f "$t.sql2"; pg_dump -sx -t "$t" $DB | grep -v -e '^--' -e '^set' -i | while read a; do
if [ $s -eq 1 ] ; then
if [ "a$a" = 'a);' ] ; then s=2 ; else echo $a ; fi;
elif [ $s -eq 2 ] ; then
b=$(echo $a | sed -e 's/\s*ADD CONSTRAINT\(.*\);/CONSTRAINT \1/')
if [ "a$b" != "a$a" ] ; then
echo ",$b"
elif [ "a$a" != "a${a/OWNER TO/}" ] ; then
echo $a >> "$t.sql2"
fi
fi
done
echo ");"
) > "$t.sql"
if test -f "$t.sql2" ; then cat "$t.sql2" >> "$t.sql"; rm -f "$t.sql2"; fi
done
27.03.2015