ฉันจะรับรายการคอลัมน์ในตารางสำหรับฐานข้อมูล SQLite ได้อย่างไร


103

ฉันต้องการดึงรายการคอลัมน์ในตาราง ฐานข้อมูลเป็น SQLite รุ่นล่าสุด (3.6 ฉันเชื่อว่า) ฉันกำลังมองหารหัสที่ทำสิ่งนี้กับแบบสอบถาม SQL คะแนนโบนัสพิเศษสำหรับข้อมูลเมตาที่เกี่ยวข้องกับคอลัมน์ (เช่นความยาวประเภทข้อมูล ฯลฯ ... )

คำตอบ:


135

สิ่งที่คุณกำลังมองหาเรียกว่าพจนานุกรมข้อมูล ใน sqlite รายการของตารางทั้งหมดสามารถพบได้โดยการสอบถามตาราง sqlite_master (หรือดู?)

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)

ในการรับข้อมูลคอลัมน์คุณสามารถใช้pragma table_info(table_name)คำสั่ง:

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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับงบ pragma ให้ดูที่เอกสาร


5
เยี่ยมมาก! ตอนนี้ทำอย่างไรจากนอกบรรทัดคำสั่ง วิธีนี้ทำได้จากภายในโปรแกรม C ของฉันเอง?
Aaron Bratcher

ฉันจะนำไปใช้เช่นเดียวกับข้างต้นใน Objective-c
Nag Raj

2
@Nag ฉันคิดว่าคุณว่า SQLite ควรถือว่าคำสั่งเหล่านี้เป็น SQL ธรรมดาประมวลผลตามนั้นและส่งคืนชุดผลลัพธ์ให้คุณ
Bryan Kyle

sqlite ไม่มี dot-shortcut แทนselect * from เหรอ
jiggunjer

การใช้ select * from table เมื่อคุณไม่ทราบว่าจำนวนระเบียนในตารางอาจเป็นผลมาจากการบันทึกหลายล้านรายการและใช้เวลาและแหล่งข้อมูล คุณควรเพิ่ม "ขีด จำกัด 1" หรืออะไรทำนองนั้น
Guy Dafny

55

นี่คือวิธีง่ายๆ:

.schema <table>

4
นี่น่าจะเป็นคำตอบจริงๆ
Ehtesh Choudhury

19
@EhteshChoudhury ไม่ควรคำถามถามถึงแบบสอบถาม SQL และนี่ไม่ใช่คำถาม
jazzpi

25

คำถามเก่า แต่ยังไม่ได้กล่าวถึงต่อไปนี้

อีกวิธีที่สะดวกในหลาย ๆ กรณีคือการเปิดส่วนหัวโดย:

sqlite> .headers on

จากนั้น

sqlite> SELECT ... FROM table

จะแสดงบรรทัดแรกที่แสดงฟิลด์ที่เลือกทั้งหมด (ทั้งหมดหากคุณเลือก *) ที่ด้านบนของผลลัพธ์


ฉันฉันเดาถูกต้องว่าปัญหาที่เกิดขึ้นจริงเป็น sqlite3 ที่ไม่ได้ให้ส่วนหัวของแบบสอบถามโดยเริ่มต้นแล้วว่าเป็นวิธีการที่เราทุกคนได้รับการมองหา ถ้าตารางคุณยาวเกินไปที่จะแสดงบน terminal LIMIT 5ของคุณเพียงแค่เพิ่มเช่น อย่าลืม;ตอนท้าย
fralau

16

เพียงแค่เข้าไปในเปลือก sqlite ของคุณ:

$ sqlite3 path/to/db.sqlite3

จากนั้นก็กด

sqlite> .schema

และคุณจะได้รับทุกสิ่ง


1
คำถามกำลังมองหาแบบสอบถาม SQL
Erica

14

นี่คือคำสั่ง SELECT ที่แสดงรายการตารางและคอลัมน์ทั้งหมดในฐานข้อมูลปัจจุบัน:

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
;

ขอบคุณ! คุณสามารถสั่งซื้อโดยสคีถ้าคุณเปลี่ยนไปORDER BY tableName, p.cid
mrm

8

นี่คือคำค้นหาที่แสดงรายการตารางทั้งหมดพร้อมคอลัมน์และข้อมูลเมตาทั้งหมดที่ฉันจะได้รับเกี่ยวกับแต่ละคอลัมน์ตามที่ OP ร้องขอ (เป็นคะแนนโบนัส)

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

ขอบคุณ @David Garoutte ที่แสดงวิธีpragma_table_infoการทำงานในแบบสอบถาม

เรียกใช้แบบสอบถามนี้เพื่อดูข้อมูลเมตาของตารางทั้งหมด:

SELECT * FROM sqlite_master WHERE type = 'table'

1

จากข้างต้นคุณสามารถทำได้ทั้งหมดในครั้งเดียว:

sqlite3 yourdb.db ".schema"

นั่นจะทำให้คุณมี SQL ในการสร้างตารางซึ่งเป็นรายการคอลัมน์อย่างมีประสิทธิภาพ


0

ฉันรู้ว่ามันนานมากแล้ว แต่ก็ไม่สายเกินไป…ฉันมีคำถามคล้าย ๆ กันกับ TCL ในฐานะล่ามและหลังจากการค้นหาหลายครั้งก็ไม่พบสิ่งใดที่ดีสำหรับฉัน ดังนั้นฉันจึงเสนอบางสิ่งที่อิงจาก PRAGMA โดยทราบว่าฐานข้อมูลของคุณเป็น "หลัก"

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

และอาร์เรย์ใช้เพื่อรับรายการ

set col_list {}
db eval { PRAGMA main.table_info(<your table name>) } TBL { lappend col_list $TBL(name) }
puts $col_list
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.