ฉันต้องการดึงรายการคอลัมน์ในตาราง ฐานข้อมูลเป็น SQLite รุ่นล่าสุด (3.6 ฉันเชื่อว่า) ฉันกำลังมองหารหัสที่ทำสิ่งนี้กับแบบสอบถาม SQL คะแนนโบนัสพิเศษสำหรับข้อมูลเมตาที่เกี่ยวข้องกับคอลัมน์ (เช่นความยาวประเภทข้อมูล ฯลฯ ... )
ฉันต้องการดึงรายการคอลัมน์ในตาราง ฐานข้อมูลเป็น SQLite รุ่นล่าสุด (3.6 ฉันเชื่อว่า) ฉันกำลังมองหารหัสที่ทำสิ่งนี้กับแบบสอบถาม SQL คะแนนโบนัสพิเศษสำหรับข้อมูลเมตาที่เกี่ยวข้องกับคอลัมน์ (เช่นความยาวประเภทข้อมูล ฯลฯ ... )
คำตอบ:
สิ่งที่คุณกำลังมองหาเรียกว่าพจนานุกรมข้อมูล ใน 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
select * from
เหรอ
นี่คือวิธีง่ายๆ:
.schema <table>
คำถามเก่า แต่ยังไม่ได้กล่าวถึงต่อไปนี้
อีกวิธีที่สะดวกในหลาย ๆ กรณีคือการเปิดส่วนหัวโดย:
sqlite> .headers on
จากนั้น
sqlite> SELECT ... FROM table
จะแสดงบรรทัดแรกที่แสดงฟิลด์ที่เลือกทั้งหมด (ทั้งหมดหากคุณเลือก *) ที่ด้านบนของผลลัพธ์
LIMIT 5
ของคุณเพียงแค่เพิ่มเช่น อย่าลืม;
ตอนท้าย
เพียงแค่เข้าไปในเปลือก sqlite ของคุณ:
$ sqlite3 path/to/db.sqlite3
จากนั้นก็กด
sqlite> .schema
และคุณจะได้รับทุกสิ่ง
นี่คือคำสั่ง 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
นี่คือคำค้นหาที่แสดงรายการตารางทั้งหมดพร้อมคอลัมน์และข้อมูลเมตาทั้งหมดที่ฉันจะได้รับเกี่ยวกับแต่ละคอลัมน์ตามที่ 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'
จากข้างต้นคุณสามารถทำได้ทั้งหมดในครั้งเดียว:
sqlite3 yourdb.db ".schema"
นั่นจะทำให้คุณมี SQL ในการสร้างตารางซึ่งเป็นรายการคอลัมน์อย่างมีประสิทธิภาพ
ฉันรู้ว่ามันนานมากแล้ว แต่ก็ไม่สายเกินไป…ฉันมีคำถามคล้าย ๆ กันกับ 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