2016-07-15 10 views
1

Ich habe eine GreenPlum-Datenbank, und ich versuche, mehrere externe Tabellen zu erstellen.PyGreSQL SQL interaktiv ausführen

Ich verwende das PyGreSQL Paket, um mit der Datenbank zu verbinden.

Allerdings kann ich nicht entkommen \i (oder \dt, \du, \dv).

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

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

Ich habe "\\i" versucht, " '\i' " und andere Kombinationen.

+0

Ich habe herausgefunden, wie es mit [dieser] (http://superuser.com/questions/701415/how-do-i-execute-run-a-sql-file-in-postgresql-9-2 -6-Centos) – syuja

Antwort

1

Ich bin nicht sicher, dass diese Aliase von generischen Clients verwendet werden können.

Sie können \i vermeiden, indem Sie zunächst die Datei h1/ext/eng/ext_eng.sql mit Python lesen und dann den resultierenden SQL-Text mit db.query() an PyGreSQL streamen.

Wie für \ dt, \ du, und \ dv - die SQL-Entsprechungen können durch Ausführen von \set ECHO_HIDDEN von einer psql-Eingabeaufforderung aus gesehen werden, dann Ausgabe jeder, um die wahre Definition zu sehen. Ich habe das Ergebnis unten eingefügt.

\ 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; 

\ ich:

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; 

Es ist nicht ideal, aber Sie können die \ d Referenzen mit diesem Code Äquivalente ersetzen .