PyGreSQL 以交互方式运行 SQL

Posted

技术标签:

【中文标题】PyGreSQL 以交互方式运行 SQL【英文标题】:PyGreSQL Run SQL interactively 【发布时间】:2016-07-15 20:23:00 【问题描述】:

我有一个 GreenPlum 数据库,我正在尝试创建几个外部表。

我正在使用PyGreSQL 包与数据库进行交互。

但是,我无法逃脱\i(或\dt\du\dv)。

db.query("\i h1/ext/eng/ext_eng" + i + ".sql")

pg.ProgrammingError: ERROR: syntax error at or near "\"

我尝试过"\\i"" '\i' " 和其他组合。

【问题讨论】:

我想出了如何使用this 【参考方案1】:

我不确定通用客户端是否可以使用这些别名。

您可以通过首先使用 Python 读取文件 h1/ext/eng/ext_eng.sql,然后使用 db.query() 将生成的 SQL 文本流式传输到 PyGreSQL 来避免 \i

对于 \dt、\du 和 \dv - SQL 等价物可以通过在 psql 提示符下运行 \set ECHO_HIDDEN 来查看,然后发出每个以查看真正的定义。我已将结果包含在下面。

\dt:

SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner", CASE c.relstorage WHEN 'h' THEN 'heap' WHEN 'x' THEN 'external' WHEN 'a' THEN 'append only' WHEN 'v' THEN 'none' WHEN 'c' THEN 'append only columnar' WHEN 'p' THEN 'parquet' WHEN 'f' THEN 'foreign' END as "Storage"

FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
AND c.relstorage IN ('h', 'a', 'c', '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;

\du:

SELECT r.rolname, r.rolsuper, r.rolinherit,
  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,
  r.rolconnlimit,
  ARRAY(SELECT b.rolname
        FROM pg_catalog.pg_auth_members m
        JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
        WHERE m.member = r.oid) as memberof
FROM pg_catalog.pg_roles r
ORDER BY 1;

\dv:

SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner", CASE c.relstorage WHEN 'h' THEN 'heap' WHEN 'x' THEN 'external' WHEN 'a' THEN 'append only' WHEN 'v' THEN 'none' WHEN 'c' THEN 'append only columnar' WHEN 'p' THEN 'parquet' WHEN 'f' THEN 'foreign' END as "Storage"

FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('v','')
AND c.relstorage IN ('v','')
      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;

这并不理想,但您可以将 \d 引用替换为这些代码等效项。

【讨论】:

以上是关于PyGreSQL 以交互方式运行 SQL的主要内容,如果未能解决你的问题,请参考以下文章

在 Sublime Text 2 中以交互方式运行 Python

以编程方式将 SQL Server 视图导出到 Excel

Shell总结11-shell运行模式

PyGreSQL入门

如何以编程方式在 RedShift sql 脚本文件上运行

SQL Server 2005 - 以编程方式导出表(运行 .sql 文件来重建它)