Postgres有许多方便的“反斜杠”命令(例如\dt
,\du
,\l
等)。我想通过RPostgresql接口运行它们。我尝试了以下方法:
drv = dbDriver("PostgreSQL")
con <- dbConnect(drv,
dbname = "my_database",
host = "**********",
port = ****,
user = "******",
password = "******")
dbExecute(con, "\\dt")
# Close PostgreSQL connection
dbDisconnect(con)
但是,出现以下错误:
Error in postgresqlExecStatement(conn, statement, ...) :
RS-DBI driver: (could not Retrieve the result : ERROR: syntax error at or
near "\"
LINE 1: \dt
^
)
是否可以从RPostgresql运行它们?还是反斜杠命令仅限于命令行psql
?
答案 0 :(得分:3)
反斜杠命令由psql
CLI工具解释,底层的客户端库不知道它们是什么,PostgreSQL服务器也不知道。 RPostgresql将使用客户端库(或者直接说PostgreSQL协议与服务器通信),因此反斜杠命令将不可用。
但是,反斜杠命令只是访问PostgreSQL系统表的查询的便捷包装。 psql
has a -E
switch将使您看到以下查询:
-E
--echo-hidden
回显\d
和其他反斜杠命令生成的实际查询。您可以使用它来研究psql的内部操作。这等效于将变量ECHO_HIDDEN
设置为on。
因此,您可以运行psql -E ...
来查看如何实现\dt
:
=> \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' 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;
**************************
List of relations
...
,然后像运行RPostgreSQL中的任何其他查询一样运行SQL。