¿Existe un equivalente de la tabla SHOW CREATE de MySQL en Postgres?

66

¿Hay un equivalente de MySQL SHOW CREATE TABLEen Postgres? es posible? Si no, ¿cuál es la siguiente mejor solución?

Necesito la declaración porque la uso para crear la tabla en un servidor remoto (sobre WCF).

vlebar
fuente
Y pensé que MySQL era la base de datos que carecía de todas las características interesantes ...
Christopher K.

Respuestas:

27

Puede intentar rastrear en el archivo de registro de PostgreSQL lo que realmente hace "pg_dump -t table -s". Luego puede usar el mismo método para escribir su propia función sql.

RJS
fuente
ok, rastreé el pg_dump. Pero no fue tan fácil, porque tuve que escribir mi propia función en C # para escribir la declaración de creación de tabla. Pero fue de gran ayuda, así que muchas gracias muuuuuuy mucho. : D
vlebar
No es necesario que te metas en todos esos problemas: de acuerdo con esto , puedes usar la -Eopción para rastrear lo que sucede en segundo plano cuando ejecutas un psqlcomando: -E: will describe the underlaying queries of the \ commands (cool for learning!)¡HTH!
Vérace
40

pg_dump:

pg_dump -st tablename dbname

o use PostgreSQL GUI Tools (pgAdmin, phpPgAdmin, etc.)

alvosu
fuente
Trataré de explicar el problema con más detalle. Necesito la instrucción sql (procedimiento seleccionado o almacenado) porque ejecuto el comando sql en C # (NpgsqlCommand). Así que creo que pg_dump no es la solución en este caso. :(
vlebar
1
Por qué no? --schema-onlytiene este propósito exacto: mostrar las instrucciones SQL para crear el esquema / tabla. Puede alimentar esta salida en su programa C # de alguna manera.
Sven
mira las vistas de information_schema: postgresql.org/docs/9.0/interactive/information-schema.html
alvosu
1
@SvenW: Haría eso si tuviera un conjunto conocido de tablas. El problema es que el usuario puede, si lo desea, sincronizar cualquier tabla en la base de datos seleccionada y luego crear la tabla seleccionada en un servidor remoto detrás de un servicio wcf. Puedo hacer eso con mssql y ahora quiero expandir el programa cliente a otros servidores sql (mysql, oracle, postgresql, ...) OK, puedo hacer pg_dump para una tabla que el usuario quiere sincronizar, pero si es es posible hacerlo solo en plsql, quiero hacerlo en plsql
vlebar
1
Si va a descargar .tar, tome el restore.sqlarchivo del archivo. Tiene todas las declaraciones de creación.
Joseph Lust
15

En la línea de comando ( psql) puede ejecutar: \d <table name>para enumerar todas las columnas, sus tipos e índices.

Lukasz Czerwinski
fuente
55
Esto es útil, pero no responde la pregunta.
Ryan Tuck
4

Partiendo de la primera parte de la respuesta de @ CubicalSoft, puede colocar la siguiente función que debería funcionar para tablas simples (asume el esquema 'público' predeterminado y omite restricciones, índices y tipos de datos definidos por el usuario, etc.). La respuesta de @RJS es la única forma de hacerlo correctamente en este momento; ¡Esto es algo que debería integrarse en psql!

CREATE OR REPLACE FUNCTION show_create_table(table_name text, join_char text = E'\n' ) 
  RETURNS text AS 
$BODY$
SELECT 'CREATE TABLE ' || $1 || ' (' || $2 || '' || 
    string_agg(column_list.column_expr, ', ' || $2 || '') || 
    '' || $2 || ');'
FROM (
  SELECT '    ' || column_name || ' ' || data_type || 
       coalesce('(' || character_maximum_length || ')', '') || 
       case when is_nullable = 'YES' then '' else ' NOT NULL' end as column_expr
  FROM information_schema.columns
  WHERE table_schema = 'public' AND table_name = $1
  ORDER BY ordinal_position) column_list;
$BODY$
  LANGUAGE SQL STABLE;
EoghanM
fuente
Esta debería ser la respuesta aceptada
exebook
¡Gracias por esto!
franco
3

Me doy cuenta de que llego un poco tarde a esta fiesta, pero este fue el primer resultado de mi Búsqueda de Google, así que pensé que respondería con lo que se me ocurrió.

Puede llegar bastante lejos hacia una solución con esta consulta para obtener las columnas:

SELECT *
FROM information_schema.columns
WHERE table_schema = 'YOURSCHEMA' AND table_name = 'YOURTABLE'
ORDER BY ordinal_position;

Y luego esta consulta para los índices más comunes:

SELECT c.oid, c.relname, a.attname, a.attnum, i.indisprimary, i.indisunique
FROM pg_index AS i, pg_class AS c, pg_attribute AS a
WHERE i.indexrelid = c.oid AND i.indexrelid = a.attrelid AND i.indrelid = 'YOURSCHEMA.YOURTABLE'::regclass
ORDER BY" => "c.oid, a.attnum

Entonces se trata de construir las cadenas de consulta en el formato correcto.

CubículoSoft
fuente
2

Como se respondió en https://serverfault.com/a/875414/333439 , con el \d <table>metacomando psqles posible mostrar la estructura de la tabla en la base de datos. Si desea ver la consulta utilizada en el metacomando, puede usar el comando psql -E. Como se describe en la página de manual, el -Econmutador repite las \dconsultas de metacomandos. Por lo tanto, puede iniciar psql -E, puede ver la estructura de la tabla con \d <table>metacomando y, de acuerdo con el -Emodificador, puede ver la consulta generada para describir la estructura de la tabla

Enrico Bianchi
fuente
0

En pgAdmin 4 , solo encuentre la tabla en el árbol de la izquierda, por ejemplo:

Servers
+ PostgreSQL 11
  + Databases
    + MYDATABASENAME
      + Schemas
        + public
          + Tables
            + MYTABLENAME  <-- click this tree element

Cuando se selecciona la tabla, abra la pestaña SQL a la derecha. Muestra el CREATE TABLEpara la tabla seleccionada.

Christopher K.
fuente