如何使用 Sequel 运行 Postgres psql“斜线”命令

man*_*bot 2 ruby postgresql sequel psql

使用Sequel,是否可以运行 PostgreSQL“斜线”命令,例如\d,\dn\copy table...?

我尝试使用

DB.run(‘\dn’)
Run Code Online (Sandbox Code Playgroud)

但是我遇到了语法错误,因为,大概是 Sequel 正在尝试解析 SQL,或者 Postgres 无法理解 SQL,因为这些是由psql应用程序处理的命令。

mu *_*ort 6

斜杠命令是 的功能psql,而不是服务器的功能,因此它们只能在psql. 但是,其中一些(例如\copy)具有服务器确实理解的等效项,其余的是系统表查询的快捷方式。如果你运行psql -E

-E
--echo-hidden
回显由\d和其他反斜杠命令生成的实际查询。你可以用这个来研究psql的内部操作。这相当于将变量设置ECHO_HIDDEN为 on。

然后您可以看到查询,并且您应该能够使用这些查询DB.runDB.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;
**************************
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的方法,但您需要使用“DB.fetch(sql_string).all”,因为“DB.run(sql_string)”返回 nil。 (3认同)