Apakah ada yang setara dengan MySQL SHOW CREATE TABLE
di Postgres? Apakah ini mungkin? Jika tidak, apa solusi terbaik berikutnya?
Saya perlu pernyataan karena saya menggunakannya untuk membuat tabel di server jauh (lebih dari WCF).
Apakah ada yang setara dengan MySQL SHOW CREATE TABLE
di Postgres? Apakah ini mungkin? Jika tidak, apa solusi terbaik berikutnya?
Saya perlu pernyataan karena saya menggunakannya untuk membuat tabel di server jauh (lebih dari WCF).
Jawaban:
Anda dapat mencoba melacak di file log PostgreSQL apa yang sebenarnya dilakukan oleh "pg_dump -t table -s". Kemudian Anda dapat menggunakan metode yang sama untuk menulis fungsi sql Anda sendiri.
pg_dump:
pg_dump -st tablename dbname
atau gunakan Alat GUI PostgreSQL (pgAdmin, phpPgAdmin, dll.)
--schema-only
memiliki tujuan yang tepat ini: Tampilkan pernyataan SQL untuk membuat skema / tabel. Anda dapat memasukkan output ini ke dalam program C # Anda entah bagaimana.
.tar
, ambil restore.sql
file dari arsip. Ia memiliki semua pernyataan buat.
Di baris perintah ( psql
) Anda dapat menjalankan: \d <table name>
untuk membuat daftar semua kolom, jenis dan indeksnya.
Membangun bagian pertama dari jawaban @ CubicalSoft, Anda dapat memasukkan fungsi berikut yang seharusnya berfungsi untuk tabel sederhana (mengasumsikan skema 'publik' default dan menghilangkan batasan, indeks, dan tipe data yang ditentukan pengguna, dll.). Jawaban @RJS adalah satu-satunya cara untuk melakukannya dengan benar saat ini; ini adalah sesuatu yang harus dibangun ke 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;
Saya menyadari bahwa saya agak terlambat ke pesta ini, tetapi ini adalah hasil pertama untuk Pencarian Google saya jadi saya pikir saya akan menjawab dengan apa yang saya hasilkan.
Anda bisa mendapatkan solusi yang cukup jauh dengan kueri ini untuk mendapatkan kolom:
SELECT *
FROM information_schema.columns
WHERE table_schema = 'YOURSCHEMA' AND table_name = 'YOURTABLE'
ORDER BY ordinal_position;
Dan kemudian permintaan ini untuk indeks yang paling umum:
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
Maka itu adalah masalah membangun string kueri dalam format yang tepat.
Seperti yang dijawab dalam https://serverfault.com/a/875414/333439 , dengan \d <table>
meta-command psql
memungkinkan untuk memperlihatkan struktur tabel dalam database. Jika Anda ingin melihat kueri yang digunakan dalam meta-command, Anda bisa menggunakan perintah itu psql -E
. Seperti yang dijelaskan dalam halaman manual, -E
sakelar menggemakan \d
kueri meta-command. Jadi, Anda bisa meluncurkan psql -E
, Anda bisa melihat struktur tabel dengan \d <table>
meta-command, dan, sesuai dengan -E
switch, Anda bisa melihat kueri yang dihasilkan untuk menggambarkan struktur tabel
Di pgAdmin 4 , cari saja tabel di pohon di sebelah kiri, mis:
Servers
+ PostgreSQL 11
+ Databases
+ MYDATABASENAME
+ Schemas
+ public
+ Tables
+ MYTABLENAME <-- click this tree element
Ketika tabel dipilih, buka tab SQL di sebelah kanan. Ini menampilkan CREATE TABLE
untuk tabel yang dipilih.
Ekstensi postgres ddlx ( https://github.com/lacanoid/pgddl ) melakukan hal ini dan lebih banyak lagi.