Làm cách nào để lấy danh sách cột trong bảng cho cơ sở dữ liệu SQLite?


102

Tôi đang tìm cách truy xuất danh sách các cột trong bảng. Cơ sở dữ liệu là phiên bản mới nhất của SQLite (tôi tin là 3.6). Tôi đang tìm mã thực hiện điều này bằng truy vấn SQL. Điểm thưởng thêm cho siêu dữ liệu liên quan đến các cột (ví dụ: độ dài, kiểu dữ liệu, v.v.)

Câu trả lời:


134

Những gì bạn đang tìm kiếm được gọi là từ điển dữ liệu. Trong sqlite có thể tìm thấy danh sách tất cả các bảng bằng cách truy vấn bảng sqlite_master (hoặc xem?)

sqlite> create table people (first_name varchar, last_name varchar, email_address varchar);
sqlite> select * from sqlite_master;
table|people|people|2|CREATE TABLE people (first_name varchar, last_name varchar, email_address varchar)

Để nhận thông tin cột, bạn có thể sử dụng pragma table_info(table_name)câu lệnh:

sqlite> pragma table_info(people);
0|first_name|varchar|0||0
1|last_name|varchar|0||0
2|email_address|varchar|0||0

Để biết thêm thông tin về các câu lệnh pragma, hãy xem tài liệu .


5
Tuyệt quá! Bây giờ điều này được thực hiện như thế nào từ bên ngoài dòng lệnh? Làm thế nào điều này được thực hiện từ trong chương trình C của riêng tôi?
Aaron Bratcher,

làm thế nào tôi có thể triển khai tương tự như trên trong Objective-c
Nag Raj

2
@Nag, tôi nghĩ bạn rằng SQLite chỉ nên coi các lệnh này như SQL thông thường, xử lý nó cho phù hợp và trả về cho bạn một tập kết quả.
Bryan Kyle

không phải sqlite có một số dấu chấm tắt thay vì select * from ?
jiggunjer

Sử dụng select * from table, khi bạn không biết có bao nhiêu bản ghi trong bảng có thể có kết quả của các bản ghi milions và mất thời gian và nguồn. Bạn nên thêm "giới hạn 1" hoặc một cái gì đó tương tự.
Guy Dafny

55

Đây là cách đơn giản:

.schema <table>

4
Đây thực sự nên là câu trả lời.
Ehtesh Choudhury 23/1213

19
@EhteshChoudhury không, không nên, câu hỏi yêu cầu truy vấn SQL và đây không phải là một.
jazzpi

25

Câu hỏi cũ nhưng điều sau vẫn chưa được đề cập.

Một cách thuận tiện khác trong nhiều trường hợp là bật tiêu đề bằng cách:

sqlite> .headers on

Sau đó,

sqlite> SELECT ... FROM table

sẽ hiển thị dòng tiêu đề hiển thị tất cả các trường đã chọn (tất cả nếu bạn CHỌN *) ở đầu đầu ra.


Tôi đoán đúng rằng vấn đề thực sự là sqlite3 không cung cấp tiêu đề của truy vấn theo mặc định, thì đó là giải pháp mà tất cả chúng ta đang tìm kiếm . Nếu bảng của bạn quá dài được hiển thị trên thiết bị đầu cuối của bạn, chỉ cần thêm, ví dụ LIMIT 5. Đừng quên ;ở cuối.
fralau

16

chỉ cần đi vào trình bao sqlite của bạn:

$ sqlite3 path/to/db.sqlite3

và sau đó chỉ cần đánh

sqlite> .schema

và bạn sẽ nhận được mọi thứ.


1
Câu hỏi đang tìm kiếm một truy vấn SQL.
Erica

13

Đây là câu lệnh SELECT liệt kê tất cả các bảng và cột trong cơ sở dữ liệu hiện tại:

SELECT m.name as tableName, 
       p.name as columnName
FROM sqlite_master m
left outer join pragma_table_info((m.name)) p
     on m.name <> p.name
order by tableName, columnName
;

Cảm ơn! Bạn có thể đặt hàng theo giản đồ nếu bạn thay đổi ORDER BYthành tableName, p.cid.
mrm

7

Đây là một truy vấn liệt kê tất cả các bảng với các cột của chúng và tất cả siêu dữ liệu tôi có thể nhận được về mỗi cột theo yêu cầu của OP (dưới dạng điểm thưởng).

SELECT
  m.name AS table_name, 
  p.cid AS col_id,
  p.name AS col_name,
  p.type AS col_type,
  p.pk AS col_is_pk,
  p.dflt_value AS col_default_val,
  p.[notnull] AS col_is_not_null
FROM sqlite_master m
LEFT OUTER JOIN pragma_table_info((m.name)) p
  ON m.name <> p.name
WHERE m.type = 'table'
ORDER BY table_name, col_id

Cảm ơn @David Garoutte đã chỉ cho tôi cách bắt pragma_table_infođầu làm việc trong một truy vấn.

Chạy truy vấn này để xem tất cả siêu dữ liệu bảng:

SELECT * FROM sqlite_master WHERE type = 'table'

1

Xây dựng trên những điều trên, bạn có thể làm tất cả cùng một lúc:

sqlite3 yourdb.db ".schema"

Điều đó sẽ cung cấp cho bạn SQL để tạo bảng, đây là danh sách các cột một cách hiệu quả.


0

Tôi biết, đã lâu nhưng không bao giờ là quá muộn… Tôi đã có một câu hỏi tương tự với TCL với tư cách là thông dịch viên và sau nhiều lần tìm kiếm, không tìm thấy gì tốt cho tôi. Vì vậy, tôi đề xuất một cái gì đó dựa trên PRAGMA, biết rằng DB của bạn là "chính"

db eval { PRAGMA main.table_info(<your table name>) } TBL { puts $TBL(name) }

Và sử dụng mảng để lấy danh sách

set col_list {}
db eval { PRAGMA main.table_info(<your table name>) } TBL { lappend col_list $TBL(name) }
puts $col_list
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.