C'è un equivalente di MySQL SHOW CREATE TABLE
in Postgres? È possibile? In caso contrario, qual è la prossima soluzione migliore?
Ho bisogno dell'istruzione perché la uso per creare la tabella su un server remoto (su WCF).
C'è un equivalente di MySQL SHOW CREATE TABLE
in Postgres? È possibile? In caso contrario, qual è la prossima soluzione migliore?
Ho bisogno dell'istruzione perché la uso per creare la tabella su un server remoto (su WCF).
Risposte:
Puoi provare a tracciare nel file di registro PostgreSQL cosa fa realmente "pg_dump -t table -s". Quindi puoi usare lo stesso metodo per scrivere la tua funzione sql.
pg_dump:
pg_dump -st tablename dbname
oppure usa gli strumenti della GUI di PostgreSQL (pgAdmin, phpPgAdmin, ecc.)
--schema-only
ha questo preciso scopo: Mostra le istruzioni SQL per creare lo schema / tabella. Puoi in qualche modo inserire questo output nel tuo programma C #.
.tar
, prendi il restore.sql
file dall'archivio. Ha tutte le istruzioni create.
Nella riga di comando ( psql
) è possibile eseguire: \d <table name>
per elencare tutte le colonne, i loro tipi e indici.
Partendo dalla prima parte della risposta di @ CubicalSoft è possibile inserire la seguente funzione che dovrebbe funzionare per tabelle semplici (presuppone lo schema "pubblico" predefinito e omette vincoli, indici e tipi di dati definiti dall'utente ecc. Ecc.). La risposta di @RJS è l'unico modo per farlo correttamente al momento; questo è qualcosa che dovrebbe essere integrato in 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;
Mi rendo conto di essere un po 'in ritardo a questa festa, ma questo è stato il primo risultato della mia Ricerca Google, quindi ho pensato di rispondere con quello che mi è venuto in mente.
Puoi ottenere abbastanza lontano verso una soluzione con questa query per ottenere le colonne:
SELECT *
FROM information_schema.columns
WHERE table_schema = 'YOURSCHEMA' AND table_name = 'YOURTABLE'
ORDER BY ordinal_position;
E quindi questa query per gli indici più comuni:
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
Quindi si tratta di costruire le stringhe di query nel formato corretto.
Come spiegato in https://serverfault.com/a/875414/333439 , con il \d <table>
meta-comando in psql
è possibile mostrare la struttura della tabella nel database. Se si desidera visualizzare la query utilizzata nel meta-comando, è possibile utilizzare il comando psql -E
. Come descritto nella manpage, l' -E
interruttore fa eco alle \d
query dei meta comandi. Quindi, è possibile avviare psql -E
, è possibile visualizzare la struttura della tabella con \d <table>
meta-comando e, in base al -E
passaggio, è possibile visualizzare la query generata per descrivere la struttura della tabella
In pgAdmin 4 , trova la tabella nella struttura a sinistra, ad esempio:
Servers
+ PostgreSQL 11
+ Databases
+ MYDATABASENAME
+ Schemas
+ public
+ Tables
+ MYTABLENAME <-- click this tree element
Quando viene selezionata la tabella, aprire la scheda SQL sulla destra. Visualizza il CREATE TABLE
per la tabella selezionata.
L'estensione Postgres ddlx ( https://github.com/lacanoid/pgddl ) fa esattamente questo e altro.