Làm cách nào để liệt kê các bảng trong tệp cơ sở dữ liệu SQLite đã được mở bằng ATTACH?


1197

Có gì SQL có thể được sử dụng để liệt kê các bảng, và hàng ở mỗi bảng trong một SQLite tập tin cơ sở dữ liệu - một khi tôi đã gắn nó với các ATTACHlệnh trên SQLite 3 công cụ dòng lệnh?


1
hãy thử cái này bạn đã có thông tin đầy đủ về các bảng http://www.sqlite.org/pragma.html#schema
Piyush

2
Sau đây là một GUI hữu ích cho sqlite nếu bạn quan tâm: sqlitestudio.pl Cung cấp cho bạn quyền truy cập để xem chi tiết về cơ sở dữ liệu, bảng, rất nhanh chóng và có trình chỉnh sửa truy vấn đẹp ...
James Oravec

17
.tablescho các bảng và .schema ?TABLE?cho lược đồ của bảng cụ thể.
H6.

.table 'bank_%'hoặc .table '%_empl'cũng là cú pháp hợp lệ để bỏ qua các tiền tố / hậu tố!
gavenkoa

Câu trả lời:


576

Các hàm .tables.schema"người trợ giúp" không xem xét cơ sở dữ liệu ATTACHed: họ chỉ truy vấn SQLITE_MASTERbảng cho cơ sở dữ liệu "chính". Do đó, nếu bạn sử dụng

ATTACH some_file.db AS my_db;

sau đó bạn cần phải làm

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

Lưu ý rằng các bảng tạm thời không hiển thị với .tablesmột trong hai: bạn phải liệt kê sqlite_temp_mastercho điều đó:

SELECT name FROM sqlite_temp_master WHERE type='table';

121
Chỉ "SELECT name FROM sqlite_master WHERE type='table'"hoạt động với tôi
vladkras

3
Tên CHỌN TỪ my_db.sqlite_master WHERE type = 'bảng'; điều này không hoạt động với tôi (đối với DB đính kèm) và nó gây ra lỗi vì: không có bảng nào như vậy tồn tại "my_db.sqlite_master"
kanika

những gì bạn có nghĩa là bảng tạm thời? Có khi nào tôi mới mở tệp db SQLite không?
Ewoks

Các bảng tạm thời là những bảng được tạo bằng CREATE TEMPORARY TABLEcác lệnh SQL. Nội dung của chúng bị hủy khi kết nối cơ sở dữ liệu hiện tại bị đóng và chúng không bao giờ được lưu vào tệp cơ sở dữ liệu.
Anthony Williams

1
Theo chế độ lệnh sqlite3 và chạy ATTACH "some_file.db" AS my_db; Nó hoạt động!
John_J

1272

Có một vài bước để xem các bảng trong cơ sở dữ liệu SQLite:

  1. Liệt kê các bảng trong cơ sở dữ liệu của bạn:

    .tables
  2. Liệt kê bảng trông như thế nào:

    .schema tablename
  3. In toàn bộ bảng:

    SELECT * FROM tablename;
  4. Liệt kê tất cả các lệnh nhắc SQLite có sẵn:

    .help

45
.table.tablesđều được cho phép. Đối với vấn đề đó, .tacũng sẽ hoạt động, vì sqlite3 sẽ chấp nhận bất kỳ lệnh nào không rõ ràng. Tên của lệnh theo sự trợ giúp thực sự là ".tables" (nếu bất cứ ai vẫn đang chú ý).
dbn

29
(Đây phải là câu trả lời được chấp nhận, đó là cách sqlite-y nhất để làm mọi thứ).
dbn

6
.tablessẽ không hiển thị bảng nếu một (các) cơ sở dữ liệu đã mở thông qua ATTACH '<path>' AS <name>;nhưng câu trả lời của lasse sẽ làm. Kể từ khi OP đề cập đến ATTACHing, tôi tin rằng anh ấy đã đúng khi không chấp nhận câu trả lời này. chỉnh sửa: chỉ cần lưu ý rằng anthony và những người khác dưới đây cũng chỉ ra điều này.
antiplex

2
@dbw: Không cần thiết. Hãy xem xét bạn đang thực hiện một trình bao bọc DB có thể sử dụng SQLite hoặc MySql (trường hợp của tôi). Sử dụng nhiều lệnh tuân thủ SQL hơn sẽ giúp việc chuyển gói được gói bằng các ngôn ngữ khác trở nên dễ dàng hơn nếu bạn sử dụng các lệnh cụ thể của nhà cung cấp DB.
Valentin Heinitz

"... sqlite3 sẽ chấp nhận bất kỳ lệnh nào không rõ ràng ..." Thật không may, đôi khi nó cũng chấp nhận các lệnh mơ hồ. Ví dụ: ".s" được hiểu là ".show", mặc dù ".schema", '.separator "hoặc" .stats "cũng có thể là các khả năng. Và khi nó không chấp nhận một lệnh mơ hồ, thì nó không liệt kê các khả năng.

442

Có vẻ như bạn cần phải đi qua bảng sqlite_master , như thế này:

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

Và sau đó tự đi qua từng bảng với một SELECThoặc tương tự để xem các hàng.

Các lệnh .DUMP.SCHEMAkhông xuất hiện để xem cơ sở dữ liệu.


120
Không phải cái gì dễ đọc hoặc ghi nhớ để sử dụng trong tương lai; .tableslệnh dựng sẵn trực quan hơn

24
@Gryllida: mặc dù điều này có thể sử dụng được từ bất kỳ API SQL nào vì nó có giá trị SQL. Các lệnh tích hợp có thể không được hỗ trợ ở mọi nơi.
Valentin Heinitz

2
@DoktorJ Bạn đã .tablesđược sửa đổi để hiển thị các bảng từ cơ sở dữ liệu đính kèm?
Lasse V. Karlsen

4
Trong cơ sở dữ liệu đó , có, nhưng câu hỏi này là về việc hiển thị các bảng trong cơ sở dữ liệu mà bạn đã đính kèm. Có các .tableslệnh được sửa đổi để hiển thị những người là tốt?
Lasse V. Karlsen

4
Đừng! Đọc hiểu không thành công ... bằng cách nào đó tôi đã xoay sở để không bắt được tài liệu tham khảo ATTACH ... hai lần> _ <
Doktor J

162

Để hiển thị tất cả các bảng, sử dụng

SELECT name FROM sqlite_master WHERE type = "table"

Để hiển thị tất cả các hàng, tôi đoán bạn có thể lặp qua tất cả các bảng và chỉ cần thực hiện CHỌN * trên mỗi bảng. Nhưng có lẽ một DUMP là những gì bạn sau?


16
Cảm ơn câu trả lời duy nhất thực sự giải quyết câu hỏi ... "SQL nào", không phải lệnh nào có thể được sử dụng ... cảm ơn!
Brad park

Ngoài ra, điều này in một tên bảng trên mỗi dòng, trong khi .tables in nhiều cột của tên bảng (gây phiền nhiễu / không hữu ích).
Shane

68

Sử dụng .helpđể kiểm tra các lệnh có sẵn.

.table

Lệnh này sẽ hiển thị tất cả các bảng trong cơ sở dữ liệu hiện tại của bạn.


Lạ thật, nó phải chính xác, nhưng không hoạt động khi tôi sử dụng nó
Jürgen K.

42

Có một lệnh có sẵn cho điều này trên dòng lệnh SQLite:

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

Chuyển đổi thành SQL sau:

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

36

Để liệt kê các bảng bạn cũng có thể làm:

SELECT name FROM sqlite_master
WHERE type='table';

Vậy ... cur.execute(""" SELECT name FROM sqlite_master WHERE type='table';""")hay không? Điều đó không làm việc cho tôi, nhưng tôi không chắc mã này được chạy ở đâu.
jbuddy_13


24

Tôi sử dụng truy vấn này để có được nó:

SELECT name FROM sqlite_master WHERE type='table'

Và để sử dụng trong iOS:

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

16

Theo tài liệu , tương đương với MySQLs SHOW TABLES;là:

Lệnh ".tables" tương tự như cài đặt chế độ danh sách, sau đó thực hiện truy vấn sau:

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;

Tuy nhiên, nếu bạn đang kiểm tra nếu một bảng duy nhất tồn tại (hoặc để biết chi tiết về nó), hãy xem câu trả lời @LuizGeron .


15

Là phiên bản mới nhất của SQLite 3, bạn có thể phát hành:

.fullschema

để xem tất cả các báo cáo tạo của bạn.


Phiên bản SQLite 3.7.13 2012-07-17 17:46:21 Nhập ".help" để biết hướng dẫn Nhập câu lệnh SQL được kết thúc bằng dấu ";" sqlite> .fullschema Lỗi: lệnh không xác định hoặc đối số không hợp lệ: "fullschema". Nhập ".help" để được trợ giúp
Mona Jalal

2
Bạn đang sử dụng một phiên bản từ năm 2012
tiêu

12

Cách dễ nhất để làm điều này là mở cơ sở dữ liệu trực tiếp và sử dụng .dumplệnh, thay vì đính kèm nó sau khi gọi công cụ shell SQLite 3.

Vì vậy, ... (giả sử dấu nhắc dòng lệnh OS của bạn là $) thay vì $sqlite3:

sqlite3> ATTACH database.sqlite as "attached"

Từ dòng lệnh OS của bạn, hãy mở cơ sở dữ liệu trực tiếp:

$sqlite3 database.sqlite
sqlite3> .dump

10

Thông qua một union all, kết hợp tất cả các bảng vào một danh sách.

select name
from sqlite_master 
where type='table'

union all 

select name 
from sqlite_temp_master 
where type='table'

9

Sử dụng:

import sqlite3

TABLE_LIST_QUERY = "SELECT * FROM sqlite_master where type='table'"

7

Vì không ai đề cập đến tài liệu tham khảo chính thức về SQLite, tôi nghĩ rằng có thể hữu ích khi đề cập đến nó dưới tiêu đề này:

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

Bạn có thể thao tác cơ sở dữ liệu của mình bằng các lệnh được mô tả trong liên kết này. Ngoài ra, nếu bạn đang sử dụng HĐH Windows và không biết shell lệnh ở đâu, thì đó là trong trang web của SQLite:

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

Sau khi tải xuống, bấm vào tệp sqlite3.exe để khởi tạo shell lệnh SQLite . Khi được khởi tạo, theo mặc định, phiên SQLite này đang sử dụng cơ sở dữ liệu trong bộ nhớ, không phải tệp trên đĩa và do đó, tất cả các thay đổi sẽ bị mất khi phiên thoát. Để sử dụng tệp đĩa liên tục làm cơ sở dữ liệu, hãy nhập lệnh ".open ex1.db" ngay sau khi cửa sổ đầu cuối khởi động.

Ví dụ trên làm cho tệp cơ sở dữ liệu có tên "ex1.db" được mở và sử dụng và được tạo nếu nó không tồn tại trước đó. Bạn có thể muốn sử dụng một tên đường dẫn đầy đủ để đảm bảo rằng tệp nằm trong thư mục mà bạn nghĩ nó nằm trong. Sử dụng dấu gạch chéo chuyển tiếp làm ký tự phân cách thư mục. Nói cách khác, sử dụng "c: /work/ex1.db", không phải "c: \ work \ ex1.db".

Để xem tất cả các bảng trong cơ sở dữ liệu bạn đã chọn trước đó, hãy nhập lệnh .tables như được nói trong liên kết ở trên.

Nếu bạn làm việc trong Windows, tôi nghĩ có thể hữu ích khi di chuyển tệp sqlite.exe này vào cùng thư mục với các tệp Python khác. Theo cách này, tệp Python ghi vào và vỏ SQLite đọc từ các tệp .db nằm trong cùng một đường dẫn.


5

Lệnh ".schema" sẽ liệt kê các bảng có sẵn và các hàng của chúng, bằng cách hiển thị cho bạn câu lệnh được sử dụng để tạo các bảng đã nói:

sqlite> tạo bảng_a (id int, a int, b int);
sqlite> .schema bảng_a
TẠO BẢNG bảng_a (id int, a int, b int);

1

.da để xem tất cả các cơ sở dữ liệu - một cái gọi là ' chính '

bảng của cơ sở dữ liệu này có thể được nhìn thấy bởi

CHỌN tbl_name khác biệt từ thứ tự sqlite_master bằng 1;

Các cơ sở dữ liệu đính kèm cần các tiền tố bạn đã chọn với AS trong câu lệnh ATTACH, ví dụ aa (, bb, cc ...) vì vậy:

CHỌN tbl_name khác biệt từ thứ tự aa.sqlite_master bằng 1;

Lưu ý rằng ở đây bạn có được quan điểm là tốt. Để loại trừ những thứ này thêm vào nơi type = 'bảng' trước 'order'

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.