Existe um equivalente ao SHOW CREATE TABLE do MySQL no Postgres?

66

Existe um equivalente ao MySQL SHOW CREATE TABLEno Postgres? Isso é possível? Se não, qual é a próxima melhor solução?

Preciso da instrução porque a uso para criar a tabela em um servidor remoto (através do WCF).

vlebar
fonte
E eu pensei que o MySQL era o banco de dados que faltava todos os recursos interessantes ...
Christopher K.

Respostas:

27

Você pode tentar rastrear no arquivo de log do PostgreSQL o que "pg_dump -t table -s" realmente faz. Em seguida, você pode usar o mesmo método para escrever sua própria função sql.

RJS
fonte
ok, eu rastreei o pg_dump. Mas não foi tão fácil, porque eu tive que escrever minha própria função em C # para escrever a instrução create table. Mas foi uma grande ajuda, então muito obrigado veeeeerrrryyyy. : D
vlebar
Não há necessidade de enfrentar todo esse problema - de acordo com aqui, você pode usar a -Eopção para rastrear o que está acontecendo em segundo plano ao executar um psqlcomando - -E: will describe the underlaying queries of the \ commands (cool for learning!)- HTH!
Vérace 04/10
40

pg_dump:

pg_dump -st tablename dbname

ou use as ferramentas da GUI do PostgreSQL (pgAdmin, phpPgAdmin, etc.)

alvosu
fonte
vou tentar explicar o problema com mais detalhes. Eu preciso da instrução sql (procedimento selecionado ou armazenado) porque executo o comando sql em C # (NpgsqlCommand). Então, acho que o pg_dump não é a solução nesse caso. :(
vlebar
11
Por que não? --schema-onlytem este propósito exato: Mostre as instruções SQL para criar o esquema / tabela. Você pode alimentar essa saída no seu programa C # de alguma forma.
Sven
veja as visualizações information_schema: postgresql.org/docs/9.0/interactive/information-schema.html
alvosu
11
@ SvenW: Eu faria isso se eu tivesse um conjunto conhecido de tabelas. O problema é que o usuário pode, se preferir, sincronizar qualquer tabela no banco de dados selecionado e criar a tabela selecionada em um servidor remoto atrás de um serviço wcf. Posso fazer isso com o mssql e agora quero expandir o programa cliente para outros servidores sql (mysql, oracle, postgresql, ...) OK, posso fazer pg_dump para uma tabela que o usuário deseja sincronizar, mas se estiver de todo possível fazer isso apenas em plsql, eu quero fazê-lo em plsql
vlebar
11
Se estiver transferindo para .tar, pegue o restore.sqlarquivo do arquivo morto. Tem todas as instruções de criação.
Joseph Lust
15

Na linha de comando ( psql), você pode executar: \d <table name>para listar todas as colunas, seus tipos e índices.

Lukasz Czerwinski
fonte
5
Isso é útil, mas não responde à pergunta.
Ryan Tuck
4

Com base na primeira parte da resposta do @ CubicalSoft, você pode inserir a seguinte função, que deve funcionar para tabelas simples (assume o esquema 'público' padrão '' e omite restrições, índices e tipos de dados definidos pelo usuário, etc.). A resposta do @RJS é a única maneira de fazê-lo corretamente no momento; isso é algo que deve ser incorporado ao 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
fonte
Esta deve ser a resposta aceita
exebook
Obrigado por isso!
frank
3

Percebo que estou um pouco atrasado para esta festa, mas esse foi o primeiro resultado da minha Pesquisa no Google; então, pensei em responder com o que descobri.

Você pode ir muito longe em direção a uma solução com esta consulta para obter as colunas:

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

E então esta consulta para os índices mais comuns:

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

É uma questão de criar as strings de consulta no formato correto.

CubicleSoft
fonte
2

Conforme respondido em https://serverfault.com/a/875414/333439 , com o \d <table>meta-comando in psqlé possível mostrar a estrutura da tabela no banco de dados. Se você quiser ver a consulta usado em meta-comando, você pode usar o comando psql -E. Conforme descrito na página de manual, o -Eswitch faz eco das \dconsultas de meta-comandos. Assim, você pode iniciar psql -E, visualizar a estrutura da tabela com \d <table>meta-comando e, de acordo com a -Eopção, visualizar a consulta gerada para descrever a estrutura da tabela

Enrico Bianchi
fonte
0

No pgAdmin 4 , encontre a tabela na árvore à esquerda, por exemplo:

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

Quando a tabela estiver selecionada, abra a guia SQL à direita. Ele exibe o CREATE TABLEda tabela selecionada.

Christopher K.
fonte