Bagaimana daftar tabel dalam file database SQLite yang dibuka dengan ATTACH?

1197

Apa SQL dapat digunakan untuk daftar tabel, dan baris dalam tabel-tabel dalam file database SQLite - setelah saya melampirkannya dengan ATTACHperintah pada alat baris perintah SQLite 3 ?

izb
sumber
1
coba yang ini Anda mendapat info lengkap tentang tabel http://www.sqlite.org/pragma.html#schema
Piyush
2
Berikut ini adalah GUI yang berguna untuk sqlite jika Anda tertarik: sqlitestudio.pl Memberi Anda akses untuk melihat rincian basis data, tabel, dengan sangat cepat dan memiliki editor kueri yang bagus juga ...
James Oravec
17
.tablesuntuk tabel dan .schema ?TABLE?untuk skema tabel tertentu.
H6.
.table 'bank_%'atau .table '%_empl'sintaks yang valid untuk quering prefixes / suffixes!
gavenkoa

Jawaban:

576

Fungsi .tables, dan .schema"pembantu" tidak melihat ke dalam database ATTACHed: mereka hanya query SQLITE_MASTERtabel untuk database "utama". Alhasil, jika digunakan

ATTACH some_file.db AS my_db;

maka yang perlu Anda lakukan

SELECT name FROM my_db.sqlite_master WHERE type='table';

Perhatikan bahwa tabel sementara tidak muncul dengan .tablesbaik: Anda harus daftar sqlite_temp_masteruntuk itu:

SELECT name FROM sqlite_temp_master WHERE type='table';
Anthony Williams
sumber
121
Hanya "SELECT name FROM sqlite_master WHERE type='table'"bekerja untuk saya
vladkras
3
SELECT name FROM my_db.sqlite_master WHERE type = 'table'; ini tidak bekerja untuk saya (untuk DB terlampir) dan melempar kesalahan karena: tidak ada tabel seperti itu "my_db.sqlite_master"
kanika
apa yang Anda maksud dengan tabel sementara? Apakah ada ketika saya baru saja membuka file db SQLite?
Ewoks
Tabel sementara adalah tabel yang dibuat dengan CREATE TEMPORARY TABLEperintah SQL. Kontennya dibuang ketika koneksi database saat ini ditutup, dan mereka tidak pernah disimpan ke file database.
Anthony Williams
1
Di bawah mode perintah sqlite3 dan jalankan ATTACH "some_file.db" AS my_db; Ini berhasil!
John_J
1272

Ada beberapa langkah untuk melihat tabel dalam database SQLite:

  1. Daftar tabel di database Anda:

    .tables
  2. Sebutkan tabelnya:

    .schema tablename
  3. Cetak seluruh tabel:

    SELECT * FROM tablename;
  4. Daftar semua perintah prompt SQLite yang tersedia:

    .help
Mark Janssen
sumber
45
.tabledan .tableskeduanya diizinkan. Dalam hal ini, .taakan berfungsi juga, karena sqlite3 akan menerima perintah apa pun yang tidak ambigu. Nama perintah sesuai dengan bantuan memang ".tabel" (jika ada yang masih memperhatikan).
dbn
29
(Ini harus menjadi jawaban yang diterima, itu adalah cara paling sqlite-y untuk melakukan sesuatu).
dbn
6
.tablestidak akan menampilkan tabel jika seseorang membuka database ATTACH '<path>' AS <name>;tetapi jawaban lasse akan berhasil. karena OP menyebutkan ATTACHing saya percaya dia benar dalam tidak menerima jawaban ini. sunting: hanya memperhatikan bahwa anthony dan yang lainnya di bawah ini juga menunjukkan hal ini.
antiplex
2
@dbw: Tidak perlu. Pertimbangkan Anda sedang melakukan pembungkus DB yang dapat menggunakan SQLite atau MySql (kasus saya). Menggunakan lebih banyak perintah SQL-conform akan membuatnya lebih mudah untuk port yang dibungkus dalam bahasa lain maka jika Anda akan menggunakan perintah khusus DB-vendor.
Valentin Heinitz
"... sqlite3 akan menerima perintah apa pun yang tidak ambigu ..." Sayangnya kadang-kadang juga menerima perintah ambigu. Sebagai contoh, ".s" diartikan sebagai ".show", meskipun ".schema", '.separator ", atau" .stats "akan menjadi kemungkinan juga. Dan ketika tidak menerima perintah yang ambigu, itu tidak mencantumkan kemungkinan
442

Tampaknya Anda harus melalui tabel sqlite_master , seperti ini:

SELECT * FROM dbname.sqlite_master WHERE type='table';

Dan kemudian secara manual melalui setiap tabel dengan SELECTatau mirip untuk melihat baris.

The .DUMPdan .SCHEMAperintah tidak muncul untuk melihat database sama sekali.

Lasse V. Karlsen
sumber
120
Bukan sesuatu yang mudah dibaca atau diingat untuk digunakan di masa depan; .tablesperintah builtin lebih intuitif
24
@Gryllida: meskipun ini dapat digunakan dari SQL-API karena ini adalah SQL valide. Perintah bawaan mungkin tidak didukung di mana pun.
Valentin Heinitz
2
@DoktorJ Telah .tablesdimodifikasi untuk menampilkan tabel dari database terlampir?
Lasse V. Karlsen
4
Dalam database itu , ya, tapi pertanyaan ini adalah tentang menampilkan tabel dalam database yang Anda lampirkan. Apakah .tablesperintah telah dimodifikasi untuk menunjukkannya juga?
Lasse V. Karlsen
4
Doh! Pemahaman bacaan gagal ... Saya entah bagaimana berhasil tidak menangkap referensi ATTACH ... dua kali> _ <
Doktor J
162

Untuk menampilkan semua tabel, gunakan

SELECT name FROM sqlite_master WHERE type = "table"

Untuk menunjukkan semua baris, saya kira Anda dapat mengulangi semua tabel dan hanya melakukan SELECT * pada masing-masing. Tapi mungkin DUMP yang Anda cari?

Christian Davén
sumber
16
Terima kasih atas satu-satunya jawaban yang benar-benar menjawab pertanyaan ... "Apa SQL", bukan perintah apa yang dapat digunakan ... terima kasih!
Brad Parks
Juga, ini mencetak satu nama tabel per baris, sementara .tabel mencetak beberapa kolom nama tabel (mengganggu / tidak berguna).
Shane
68

Gunakan .helpuntuk memeriksa perintah yang tersedia.

.table

Perintah ini akan menampilkan semua tabel di bawah basis data Anda saat ini.

Antony.H
sumber
Aneh, itu pasti benar, tetapi tidak berfungsi ketika saya menggunakannya
Jürgen K.
42

Ada perintah yang tersedia untuk ini di baris perintah SQLite:

.tables ?PATTERN?      List names of tables matching a LIKE pattern

Yang mengonversi ke SQL berikut:

SELECT name FROM sqlite_master
WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
UNION ALL
SELECT name FROM sqlite_temp_master
WHERE type IN ('table','view')
ORDER BY 1
Peter Mortensen
sumber
36

Untuk membuat daftar tabel, Anda juga dapat melakukan:

SELECT name FROM sqlite_master
WHERE type='table';
Rafał Dowgird
sumber
Jadi ... cur.execute(""" SELECT name FROM sqlite_master WHERE type='table';""")atau tidak? Itu tidak berfungsi untuk saya, tetapi saya tidak yakin di mana kode ini seharusnya dijalankan.
jbuddy_13
32

Coba PRAGMA table_info(table-name);
http://www.sqlite.org/pragma.html#schema

Luiz Geron
sumber
2
Ini mungkin cara terbaik untuk melakukannya.
Alix Axel
7
Ini hanya berfungsi jika Anda tahu nama tabel. Anda tidak dapat menggunakan ini untuk mendapatkan daftar nama tabel.
Eric W
24

Saya menggunakan kueri ini untuk mendapatkannya:

SELECT name FROM sqlite_master WHERE type='table'

Dan untuk digunakan di iOS:

NSString *aStrQuery=[NSString stringWithFormat:@"SELECT name FROM sqlite_master WHERE type='table'"];
GameLoading
sumber
16

Menurut dokumentasi , padanan dari MySQL SHOW TABLES;adalah:

Perintah ".tables" mirip dengan pengaturan mode daftar kemudian menjalankan kueri berikut:

SELECT name FROM sqlite_master
  WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
UNION ALL
SELECT name FROM sqlite_temp_master
  WHERE type IN ('table','view')
ORDER BY 1;

Namun, jika Anda memeriksa apakah ada satu tabel (atau untuk mendapatkan detailnya), lihat jawaban @LuizGeron .

Alix Axel
sumber
15

Pada versi terbaru dari SQLite 3 Anda dapat mengeluarkan:

.fullschema

untuk melihat semua pernyataan buat Anda.

lada
sumber
SQLite versi 3.7.13 2012-07-17 17:46:21 Masukkan ".help" untuk instruksi Masukkan pernyataan SQL yang diakhiri dengan ";" sqlite> .fullschema Error: perintah tidak dikenal atau argumen tidak valid: "fullschema". Masukkan ".help" untuk bantuan
Mona Jalal
2
Anda menggunakan versi dari 2012
lada
12

Cara termudah untuk melakukan ini adalah membuka database secara langsung dan menggunakan .dumpperintah, daripada melampirkannya setelah menjalankan alat shell SQLite 3.

Jadi ... (anggap prompt perintah OS Anda adalah $) alih-alih $sqlite3:

sqlite3> ATTACH database.sqlite as "attached"

Dari baris perintah OS Anda, buka database secara langsung:

$sqlite3 database.sqlite
sqlite3> .dump
Nuh
sumber
10

Melalui a union all, gabungkan semua tabel menjadi satu daftar.

select name
from sqlite_master 
where type='table'

union all 

select name 
from sqlite_temp_master 
where type='table'
openwonk
sumber
9

Menggunakan:

import sqlite3

TABLE_LIST_QUERY = "SELECT * FROM sqlite_master where type='table'"
Mrityunjay Singh
sumber
7

Karena tidak ada yang menyebutkan tentang referensi resmi SQLite, saya pikir mungkin berguna untuk merujuknya di bawah judul ini:

https://www.sqlite.org/cli.html

Anda dapat memanipulasi basis data Anda menggunakan perintah yang dijelaskan dalam tautan ini. Selain itu, jika Anda menggunakan OS Windows dan tidak tahu di mana shell perintah, itu ada di situs SQLite:

https://www.sqlite.org/download.html

Setelah mengunduhnya, klik file sqlite3.exe untuk menginisialisasi shell perintah SQLite . Ketika diinisialisasi, secara default sesi SQLite ini menggunakan database dalam memori, bukan file pada disk, dan semua perubahan akan hilang saat sesi keluar. Untuk menggunakan file disk persisten sebagai basis data, masukkan perintah ".open ex1.db" segera setelah jendela terminal dimulai.

Contoh di atas menyebabkan file database bernama "ex1.db" dibuka dan digunakan, dan dibuat jika sebelumnya tidak ada. Anda mungkin ingin menggunakan pathname lengkap untuk memastikan bahwa file ada di direktori yang Anda pikir itu masuk. Gunakan garis miring ke depan sebagai karakter pemisah direktori. Dengan kata lain gunakan "c: /work/ex1.db", bukan "c: \ work \ ex1.db".

Untuk melihat semua tabel dalam database yang telah Anda pilih sebelumnya, ketikkan perintah .tabel seperti yang dikatakan dalam tautan di atas.

Jika Anda bekerja di Windows, saya pikir mungkin berguna untuk memindahkan file sqlite.exe ini ke folder yang sama dengan file Python lainnya. Dengan cara ini, file Python menulis dan shell SQLite membaca dari file .db berada di jalur yang sama.

oiyio
sumber
5

Komando ".schema" akan mencantumkan tabel dan baris yang tersedia, dengan menunjukkan kepada Anda pernyataan yang digunakan untuk membuat tabel tersebut:

sqlite> create table_a (id int, a int, b int);
sqlite> .schema table_a
CREATE TABLE table_a (id int, a int, b int);

sumber
1

.da untuk melihat semua basis data - yang disebut ' utama '

tabel dari basis data ini dapat dilihat oleh

PILIH tbl_name berbeda dari urutan sqlite_master sebanyak 1;

Basis data terlampir membutuhkan awalan yang Anda pilih dengan AS dalam pernyataan ATTACH misalnya aa (, bb, cc ...) jadi:

PILIH tbl_name berbeda dari pesanan aa.sqlite_master sebanyak 1;

Perhatikan bahwa di sini Anda mendapatkan pandangan juga. Untuk mengecualikan ini tambahkan di mana ketik = 'table' sebelum 'order'

Klaas-Z4us-V
sumber