Подтвердить что ты не робот

Как я могу указать схему для запуска файла sql в командной строке Postgresql

Я запускаю скрипты против моей базы данных, как это...

psql -d myDataBase -a -f myInsertFile.sql

Единственная проблема заключается в том, что я хочу иметь возможность указать в этой команде, для какой схемы запускается script. Я мог бы вызвать set search_path = 'my_schema_01', но файлы должны быть переносимыми. Как я могу это сделать?

4b9b3361

Ответ 1

Вы можете создать один файл, содержащий оператор set schema ..., а затем включить фактический файл, который вы хотите запустить:

Создайте файл run_insert.sql:

set schema 'my_schema_01';
\i myInsertFile.sql

Затем вызовите это, используя:

psql -d myDataBase -a -f run_insert.sql

Ответ 2

Более универсальным способом является установка search_path (должен работать в PostgreSQL 7.x и выше):

SET search_path TO myschema;

Обратите внимание, что set schema myschema является псевдонимом выше команды, которая не доступна в 8.x.

Смотрите также: http://www.postgresql.org/docs/9.3/static/ddl-schemas.html

Ответ 3

Основной пример

В приведенном ниже примере будет запущен myfile.sql в базе данных mydatabase с использованием схемы myschema.

psql "dbname=mydatabase options=--search_path=myschema" -a -f myfile.sql

Как это работает, первым аргументом команды psql является аргумент dbname. В документах указывается строка .

Если этот параметр содержит знак = или начинается с допустимого префикса URI (postgresql://или postgres://), он рассматривается как строка conninfo

ключевое слово dbname указывает базу данных для подключения и ключевое слово options позволяет вам указать командную строку параметры для отправки на сервер при запуске подключения. Эти параметры подробно описаны в главе конфигурации сервера. Опция, которую мы используем для выбора схемы, search_path.

Другой пример

В приведенном ниже примере будет подключаться к хосту myhost в базе данных mydatabase с помощью схемы myschema. Специальный символ = должен быть выведен с помощью escape-последовательности %3D.

psql postgres://[email protected]?options=--search_path%3Dmyschema

Ответ 4

Для достижения этого гибким способом можно использовать переменную среды PGOPTIONS.

В оболочке Unix:

PGOPTIONS="--search_path=my_schema_01" psql -d myDataBase -a -f myInsertFile.sql

Если в script или под-оболочках, которым нужны одни и те же опции, несколько приглашений, проще установить PGOPTIONS только один раз и экспортировать его.

PGOPTIONS="--search_path=my_schema_01"
export PGOPTIONS

psql -d somebase
psql -d someotherbase
...

или вызовите оболочку верхнего уровня script с PGOPTIONS, установленную снаружи

PGOPTIONS="--search_path=my_schema_01"  ./my-upgrade-script.sh

В среде Windows CMD set PGOPTIONS=value должен работать одинаково.

Ответ 5

Я использую что-то вроде этого и отлично работает: *: -)

(echo "set schema 'acme';" ; \
  cat ~/git/soluvas-framework/schedule/src/main/resources/org/soluvas/schedule/tables_postgres.sql) \
  | psql -Upostgres -hlocalhost quikdo_app_dev 

Примечание: только Linux/Mac/ Bash, хотя, вероятно, есть способ сделать это и в Windows/PowerShell.

Ответ 6

Мне приходилось сталкиваться с аналогичными проблемами, пытаясь сделать некоторый импорт данных на промежуточной схеме (позже мы перейдем к последней). Поскольку мы полагаемся на такие вещи, как расширения (например, PostGIS), sql файл "run_insert" не полностью решил проблему.

Через некоторое время мы обнаружили, что по крайней мере с Postgres 9.3 решение намного проще... просто создайте свой SQL script , всегда указывая схему при обращении к таблице:

CREATE TABLE "my_schema"."my_table" (...); COPY "my_schema"."my_table" (...) FROM stdin;

Таким образом, использование psql -f xxxxx отлично работает, и вам не нужно менять поисковые пути и не использовать промежуточные файлы (и не будет удалять проблемы схемы расширения).