2010-04-07 11 views

Respuesta

222
pg_dump -t 'aschema.atable' --schema-only database-name 

Más información -.. en el manual

+35

Tuve que especificar la base de datos también. 'pg_dump mydb -t mytable --schema-only'. – Nic

+1

@Milen A. Radev: edite la respuesta para incluir el nombrebd. Pasé 5 minutos probando variaciones de esa sintaxis calificada (ya que no estaba usando el db predeterminado). ¡Gracias! – farthVader

+1

No pude hacer que esto funcione, solo produciría nada. Me lastimé al descargar pgAdminIII y al usar su herramienta para obtener una show-create. Me sorprende que Postgres no tenga esta funcionalidad sin tener que hacer un volcado. – Amalgovinus

8

El método más fácil que se me ocurre es instalar pgAdmin 3 (found here) y utilizarlo para ver su base de datos se generará automáticamente una consulta que va a crear la tabla en cuestión

+0

pgAdmin se ve bien, pero por desgracia no tengo acceso root para instalar en el servidor .. – Raja

+7

no es necesario instalarlo en el servidor. Colóquelo en su escritorio y luego conéctelo al servidor. – Corin

30

generar la creación de státem mesa. ent para una tabla en PostgreSQL desde la línea de comandos de Linux:

Esta declaración da salida a la mesa de crear instrucción SQL para mí:

pg_dump -U your_db_user_name your_database -t your_table_name --schema-only 

Explicación:

pg_dump nos ayuda a obtener información acerca de la propia base de datos . -U significa nombre de usuario. Mi usuario de pgadmin no tiene contraseña establecida, así que no tengo que ingresar una contraseña. La opción -t significa especificar para una tabla. --schema-only significa imprimir solo datos sobre la tabla, y no los datos en la tabla. Aquí está el comando exacto que utilizo:

pg_dump -U pgadmin kurz_prod -t fact_stock_info --schema-only 
51

Mi solución es iniciar sesión en los postgres dB usando psql con la opción -E de la siguiente manera:

psql -E -U username -d database 

En psql, ejecute los siguientes comandos para ver el SQL que postgres utiliza para generar
la declaración tabla siguientes describen:

-- List all tables in the schema (my example schema name is public) 
\dt public.* 
-- Choose a table name from above 
-- For create table of one public.tablename 
\d+ public.tablename 

Basado en el SQL se hizo eco a cabo después de ejecutar éstos describen comman ds, yo era capaz de armar
la siguiente función plpgsql:

CREATE OR REPLACE FUNCTION generate_create_table_statement(p_table_name varchar) 
    RETURNS text AS 
$BODY$ 
DECLARE 
    v_table_ddl text; 
    column_record record; 
BEGIN 
    FOR column_record IN 
     SELECT 
      b.nspname as schema_name, 
      b.relname as table_name, 
      a.attname as column_name, 
      pg_catalog.format_type(a.atttypid, a.atttypmod) as column_type, 
      CASE WHEN 
       (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128) 
       FROM pg_catalog.pg_attrdef d 
       WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) IS NOT NULL THEN 
       'DEFAULT '|| (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128) 
           FROM pg_catalog.pg_attrdef d 
           WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) 
      ELSE 
       '' 
      END as column_default_value, 
      CASE WHEN a.attnotnull = true THEN 
       'NOT NULL' 
      ELSE 
       'NULL' 
      END as column_not_null, 
      a.attnum as attnum, 
      e.max_attnum as max_attnum 
     FROM 
      pg_catalog.pg_attribute a 
      INNER JOIN 
      (SELECT c.oid, 
       n.nspname, 
       c.relname 
       FROM pg_catalog.pg_class c 
        LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
       WHERE c.relname ~ ('^('||p_table_name||')$') 
       AND pg_catalog.pg_table_is_visible(c.oid) 
       ORDER BY 2, 3) b 
      ON a.attrelid = b.oid 
      INNER JOIN 
      (SELECT 
        a.attrelid, 
        max(a.attnum) as max_attnum 
       FROM pg_catalog.pg_attribute a 
       WHERE a.attnum > 0 
       AND NOT a.attisdropped 
       GROUP BY a.attrelid) e 
      ON a.attrelid=e.attrelid 
     WHERE a.attnum > 0 
      AND NOT a.attisdropped 
     ORDER BY a.attnum 
    LOOP 
     IF column_record.attnum = 1 THEN 
      v_table_ddl:='CREATE TABLE '||column_record.schema_name||'.'||column_record.table_name||' ('; 
     ELSE 
      v_table_ddl:=v_table_ddl||','; 
     END IF; 

     IF column_record.attnum <= column_record.max_attnum THEN 
      v_table_ddl:=v_table_ddl||chr(10)|| 
        ' '||column_record.column_name||' '||column_record.column_type||' '||column_record.column_default_value||' '||column_record.column_not_null; 
     END IF; 
    END LOOP; 

    v_table_ddl:=v_table_ddl||');'; 
    RETURN v_table_ddl; 
END; 
$BODY$ 
    LANGUAGE 'plpgsql' COST 100.0 SECURITY INVOKER; 

Aquí está el uso de la función:

SELECT generate_create_table_statement('tablename'); 

Y aquí es la sentencia de descarte si no desea esta función para persisten de forma permanente:

DROP FUNCTION generate_create_table_statement(p_table_name varchar); 
+1

Bien, estaba buscando un camino de plpgsql.La parte LOOP está un poco rota, genera la primera columna dos veces y se salta la última columna. He editado la publicación para solucionar esto. – Webmut

+0

Muy útil ya que también le permite crear una declaración de tabla para las vistas :) – Wolph

+0

"Basado en el sql recuperado después de ejecutar estos comandos de descripción" - No veo ningún resultado SQL. solo descriptores de columna. ¿Me estoy perdiendo de algo? – ekkis

6

Si quieres hacer esto por varias mesas a la vez, que meed utilizar la opción -t varias veces (me tomó un tiempo t o averiguar por qué la lista separada por comas no funcionaba).Además, puede ser útil para enviar los resultados a un archivo de salida o tubo a un servidor postgres en otra máquina

pg_dump -t table1 -t table2 database_name --schema-only > dump.sql 

pg_dump -t table1 -t table2 database_name --schema-only | psql -h server_name database_name 
2

Ésta es la variación que funciona para mí:

pg_dump -U user_viktor -h localhost unit_test_database -t floorplanpreferences_table --schema-only

Además, si está utilizando esquemas, usted, por supuesto, tiene que especificar que así:

pg_dump -U user_viktor -h localhost unit_test_database -t "949766e0-e81e-11e3-b325-1cc1de32fcb6".floorplanpreferences_table --schema-only

se hará Obtenga una salida que puede usar para crear la tabla nuevamente, solo ejecute esa salida en psql.

15

Si usted quiere encontrar la sentencia de creación de una tabla sin usar pg_dump, Esta consulta podría funcionar para usted (modificar 'nombreTabla' con lo que se llama su mesa):

SELECT           
    'CREATE TABLE ' || relname || E'\n(\n' || 
    array_to_string(
    array_agg(
     ' ' || column_name || ' ' || type || ' '|| not_null 
    ) 
    , E',\n' 
) || E'\n);\n' 
from 
(
    SELECT 
    c.relname, a.attname AS column_name, 
    pg_catalog.format_type(a.atttypid, a.atttypmod) as type, 
    case 
     when a.attnotnull 
    then 'NOT NULL' 
    else 'NULL' 
    END as not_null 
    FROM pg_class c, 
    pg_attribute a, 
    pg_type t 
    WHERE c.relname = 'tablename' 
    AND a.attnum > 0 
    AND a.attrelid = c.oid 
    AND a.atttypid = t.oid 
ORDER BY a.attnum 
) as tabledefinition 
group by relname; 

cuando llama directamente desde psql , se usefult hacer:

\pset linestyle old-ascii 

Además, la función de generate_create_table_statementen este hilo funciona muy bien.

+0

Solo por curiosidad, ¿por qué querrías hacer esto en lugar de simplemente usar pg_dump? – AllTheTime

+5

Hola. Mi caso de uso fue que tuve acceso a la base de datos, pero no al shell. Ejecutar pg_dump requiere que tengas un usuario del sistema. – shekwi

+0

sí, sin embargo, esto no produce los permisos y restricciones que veo al final de 'pg_dump'. útil de todos modos +1 – ekkis

0

Aquí hay una versión mejorada de shekwi 's query.
Genera la restricción de clave primaria y es capaz de manejar las tablas temporales:

with pkey as 
(
    select cc.conrelid, format(E', 
    constraint %I primary key(%s)', cc.conname, 
     string_agg(a.attname, ', ' 
      order by array_position(cc.conkey, a.attnum))) pkey 
    from pg_catalog.pg_constraint cc 
     join pg_catalog.pg_class c on c.oid = cc.conrelid 
     join pg_catalog.pg_attribute a on a.attrelid = cc.conrelid 
      and a.attnum = any(cc.conkey) 
    where cc.contype = 'p' 
    group by cc.conrelid, cc.conname 
) 
select format(E'create %stable %s%I\n(\n%s%s\n);\n', 
    case c.relpersistence when 't' then 'temporary ' else '' end, 
    case c.relpersistence when 't' then '' else n.nspname || '.' end, 
    c.relname, 
    string_agg(
     format(E'\t%I %s%s', 
      a.attname, 
      pg_catalog.format_type(a.atttypid, a.atttypmod), 
      case when a.attnotnull then ' not null' else '' end 
     ), E',\n' 
     order by a.attnum 
    ), 
    (select pkey from pkey where pkey.conrelid = c.oid)) as sql 
from pg_catalog.pg_class c 
    join pg_catalog.pg_namespace n on n.oid = c.relnamespace 
    join pg_catalog.pg_attribute a on a.attrelid = c.oid and a.attnum > 0 
    join pg_catalog.pg_type t on a.atttypid = t.oid 
where c.relname = :table_name 
group by c.oid, c.relname, c.relpersistence, n.nspname; 

parámetro Use table_name para especificar el nombre de la tabla.

0
pg_dump -h XXXXXXXXXXX.us-west-1.rds.amazonaws.com -U anyuser -t tablename -s 
+2

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. – DimaSan

0

En pgAdminIII base de datos >> >> esquemas mesas >> haga clic derecho en 'La mesa' >> >> guiones 'Seleccione cualquiera (Crear, insertar, actualizar, eliminar ..)'

0

aquí es una consulta con algunas modificaciones,

select 'CREATE TABLE ' || a.attrelid::regclass::text || '(' || 
string_agg(a.attname || ' ' || pg_catalog.format_type(a.atttypid, 
a.atttypmod)|| 
     CASE WHEN 
      (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128) 
      FROM pg_catalog.pg_attrdef d 
      WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) IS NOT NULL THEN 
      ' DEFAULT '|| (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128) 
          FROM pg_catalog.pg_attrdef d 
          WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) 
     ELSE 
      '' END 
|| 
     CASE WHEN a.attnotnull = true THEN 
      ' NOT NULL' 
     ELSE 
      '' END,E'\n,') || ');' 
FROM pg_catalog.pg_attribute a join pg_class on a.attrelid=pg_class.oid 
WHERE a.attrelid::regclass::varchar = 
'TABLENAME_with_or_without_schema' 
AND a.attnum > 0 AND NOT a.attisdropped and pg_class.relkind='r' 
group by a.attrelid; 
Cuestiones relacionadas