Как запускать команды Postgres psql "sla sh" с помощью Sequel - PullRequest
2 голосов
/ 06 мая 2020

Используя Sequel , можно ли запускать команды PostgreSQL "sla sh", например \d, \dn или \copy table...?

Я пробовал используя

DB.run(‘\dn’)

, но я получил синтаксическую ошибку, потому что, предположительно, Sequel пытается проанализировать SQL, или Postgres не может понять SQL, потому что это команды, которые обрабатываются приложением psql.

1 Ответ

5 голосов
/ 07 мая 2020

Команды sla sh являются функциями psql, а не сервера, поэтому они доступны только в psql. Однако некоторые из них (например, \copy) имеют эквиваленты, понятные серверу, а остальные являются ярлыками для запросов к системным таблицам. Если вы запустите psql -E:

-E
--echo-hidden
Выведите фактические запросы, сгенерированные \d и другими командами backsla sh . Вы можете использовать это для изучения внутренних операций psql. Это эквивалентно включению переменной ECHO_HIDDEN.

, тогда вы можете видеть запросы, и вы сможете использовать эти запросы с DB.run или DB.fetch(...).all. Например:

$ psql -E -d...
=# \d
********* QUERY **********
SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'table' WHEN 'I' THEN 'index' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','p','v','m','S','f','')
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
      AND n.nspname !~ '^pg_toast'
  AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;
**************************
=# \dt
********* QUERY **********
SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'table' WHEN 'I' THEN 'index' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','p','')
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
      AND n.nspname !~ '^pg_toast'
  AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;
**************************
...