0

postgres: columns list

SELECT column_name FROM information_schema.COLUMNS WHERE TABLE_NAME='table_name'
0

postgres: сделать дамп и восстановить из дампа

Команду для создания дампа можно взять при проделывании этой операции в pgadmin’е:

/usr/bin/pg_dump --host 127.0.0.1 --port 5432 --username "postgres" --role "rolename" --no-password  --format plain --encoding UTF8 --inserts --column-inserts --verbose --file "/home/username/dump.sql" "dbname"

Чтобы развернуть базу данных из дампа:

psql -d dbname -U username -f dump.sql
0

PostgreSQL: value too long for type character varying

Импортировал я однажды базу данных PostgreSQL (в кодировке utf-8, конечно же) под управлением ubuntu, и всё шло хорошо, CREATE’ы выполнялись, индексы создавались… И тут, не пойми откуда, стали сыпаться ошибки вида «DatabaseError: value too long for type character varying(50)». Вариант о действительном наличии в запросе значений длиннее, чем положено, сразу отметается, т.к. в Debian всё отлично импортировалось. Значит, косячит PostgreSQL.

Дело в том, что шаблонная база данных template1, копированием которой создаются новые базы данных по умолчанию, изначально имела кодировку не utf-8. Следовательно, для корректного импорта нам нужно её перекодировать.

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

$ psql -U postgres

Даём разрешение на подключение к базе данных template0.

UPDATE pg_database SET datallowconn = TRUE WHERE datname = 'template0';

Переключаемся к базе данных template0.

\c template0

Удалаяем опцию «это шаблон» у базы данных template1.

UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';

Удаляем template1.

DROP DATABASE template1;

Создаём новую базу с именем template1 по шаблону template0 с кодировкой UNICODE.

CREATE DATABASE template1 WITH template = template0 encoding = 'UNICODE';

Устанавливаем базе template1 флаг шаблона.

UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';

Переключаемся к базе данных template1.

\c template1

Запрещаем подключения к template0.

UPDATE pg_database SET datallowconn = FALSE WHERE datname = 'template0';

Теперь проблем с кодировкой не будет.

PS:
Если нет желания или необходимости трогать базу template1, то можно попробовать просто создать базу с указанием шаблона template0.

CREATE DATABASE %dbname% TEMPLATE template0;

Источники:

  1. StackOverflow: postgresql – Django fixture fails, stating "DatabaseError: value too long for type character varying(50)";
  2. PostgreSQL — Управление базами данных.