วิธีแสดงตารางในไฟล์ฐานข้อมูล SQLite ที่เปิดด้วย ATTACH


1197

SQL ชนิดใดที่สามารถใช้เพื่อแสดงรายการตารางและแถวภายในตารางเหล่านั้นในไฟล์ฐานข้อมูลSQLite - เมื่อฉันแนบไฟล์ด้วยATTACHคำสั่งบนเครื่องมือบรรทัดคำสั่งSQLite 3 แล้ว


1
ลองอันนี้คุณมีข้อมูลเต็มรูปแบบของตารางhttp://www.sqlite.org/pragma.html#schema
Piyush

2
ต่อไปนี้เป็น GUI ที่มีประโยชน์สำหรับ sqlite หากคุณสนใจ: sqlitestudio.plช่วยให้คุณเข้าถึงเพื่อดูรายละเอียดของฐานข้อมูลตารางได้อย่างรวดเร็วและมีตัวแก้ไขแบบสอบถามที่ดีเช่นกัน ...
James Oravec

17
.tablesสำหรับตารางและ.schema ?TABLE?สคีมาของตารางที่ระบุ
H6

.table 'bank_%'หรือ.table '%_empl'ไวยากรณ์ที่ถูกต้องสำหรับการออกคำนำหน้า / คำต่อท้าย!
gavenkoa

คำตอบ:


576

.tablesและ.schema"ผู้ช่วย" ฟังก์ชั่นไม่ได้มองเข้าไปในฐานข้อมูลที่แนบมาด้วย: พวกเขาเพียงแค่สอบถามSQLITE_MASTERตารางสำหรับฐานข้อมูล "หลัก" ดังนั้นถ้าคุณใช้

ATTACH some_file.db AS my_db;

จากนั้นคุณต้องทำ

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

โปรดทราบว่าตารางชั่วคราวจะไม่ปรากฏขึ้นด้วย.tables: คุณต้องแสดงรายการsqlite_temp_masterดังนี้:

SELECT name FROM sqlite_temp_master WHERE type='table';

121
ใช้"SELECT name FROM sqlite_master WHERE type='table'"งานได้กับฉันเท่านั้น
vladkras

3
เลือกชื่อจาก my_db.sqlite_master WHERE type = 'table'; นี้ไม่ทำงานสำหรับฉัน (สำหรับฐานข้อมูลที่แนบมา) และมันจะพ่นข้อผิดพลาดเป็น: ไม่มีตารางเช่น "my_db.sqlite_master"
kanika

ตารางชั่วคราวหมายถึงอะไร มีบ้างไหมที่ฉันเพิ่งเปิดไฟล์ SQLite db?
Ewoks

ตารางชั่วคราวเป็นสิ่งที่สร้างขึ้นด้วย CREATE TEMPORARY TABLEคำสั่ง SQL เนื้อหาจะถูกดร็อปเมื่อการเชื่อมต่อฐานข้อมูลปัจจุบันถูกปิดและจะไม่ถูกบันทึกลงในไฟล์ฐานข้อมูล
Anthony Williams

1
ภายใต้โหมดคำสั่ง sqlite3 และเรียกใช้ATTACH "some_file.db" AS my_db; มันใช้งานได้!
John_J

1272

มีไม่กี่ขั้นตอนในการดูตารางในฐานข้อมูล SQLite:

  1. แสดงรายการตารางในฐานข้อมูลของคุณ:

    .tables
  2. แสดงลักษณะของตาราง:

    .schema tablename
  3. พิมพ์ตารางทั้งหมด:

    SELECT * FROM tablename;
  4. แสดงรายการคำสั่งพรอมต์ SQLite ที่มีทั้งหมด:

    .help

45
.tableและ.tablesทั้งคู่ได้รับอนุญาต สำหรับเรื่องนั้น.taก็ใช้งานได้เช่นกันเนื่องจาก sqlite3 จะยอมรับคำสั่งใด ๆ ที่ไม่คลุมเครือ ชื่อของคำสั่งตามความช่วยเหลือนั้นแน่นอน ".tables" (ถ้าใครยังคงให้ความสนใจ)
dbn

29
(นี่ควรเป็นคำตอบที่ยอมรับได้ซึ่งเป็นวิธีที่ดีที่สุดในการทำสิ่งต่าง ๆ )
dbn

6
.tablesจะไม่แสดงตารางหากมีฐานข้อมูลที่เปิดอยู่ATTACH '<path>' AS <name>;แต่จะมีคำตอบของ lasse ตั้งแต่ OP กล่าวถึง ATTACHing ฉันเชื่อว่าเขาพูดถูกแล้วไม่ยอมรับคำตอบนี้ แก้ไข: เพิ่งสังเกตเห็นว่าแอนโทนี่และคนอื่น ๆ ด้านล่างนี้ชี้ให้เห็น
antiplex

2
@dbw: ไม่จำเป็น พิจารณาว่าคุณกำลังทำ DB wrapper สามารถใช้ SQLite หรือ MySql (เคสของฉัน) การใช้คำสั่งที่สอดคล้องกับ SQL มากขึ้นจะช่วยให้การพอร์ตในภาษาอื่น ๆ ง่ายขึ้นถ้าคุณใช้คำสั่งเฉพาะของผู้จำหน่ายฐานข้อมูล
Valentin Heinitz

"... sqlite3 จะยอมรับคำสั่งใด ๆ ที่ไม่คลุมเครือ ... " แต่บางครั้งก็ยอมรับคำสั่งที่ไม่ชัดเจนเช่นกัน ตัวอย่างเช่น ".s" ถูกตีความว่าเป็น ".show" แม้ว่า ".schema", '.separator "หรือ" .stats "จะเป็นไปได้เช่นกันและเมื่อไม่ยอมรับคำสั่งที่ไม่ชัดเจน ไม่ได้แสดงรายการความเป็นไปได้

442

ดูเหมือนคุณจะต้องผ่านตารางsqlite_masterเช่นนี้

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

และจากนั้นไปด้วยตนเองผ่านแต่ละตารางด้วย SELECTหรือคล้ายกันเพื่อดูแถว

.DUMPและ.SCHEMAคำสั่งจะไม่ปรากฏให้เห็นฐานข้อมูลที่ทุกคน


120
ไม่ใช่สิ่งที่ง่ายต่อการอ่านหรือจดจำสำหรับใช้ในอนาคต .tablesคำสั่งbuiltin นั้นใช้งานง่ายขึ้น

24
@Gryllida: แม้จะมีสิ่งนี้สามารถใช้งานได้กับ SQL-API ใด ๆ ก็ตามเพราะมันเป็น SQL valide คำสั่งในตัวอาจไม่รองรับทุกที่
Valentin Heinitz

2
@DoktorJ ได้.tablesรับการแก้ไขเพื่อแสดงตารางจากฐานข้อมูลที่แนบมาหรือไม่?
Lasse V. Karlsen

4
ในฐานข้อมูลนั้นใช่ แต่คำถามนี้เกี่ยวกับการแสดงตารางในฐานข้อมูลที่คุณแนบ มี.tablesการแก้ไขคำสั่งเพื่อแสดงคำสั่งเหล่านั้นหรือไม่?
Lasse V. Karlsen

4
Doh! การอ่านเพื่อความเข้าใจล้มเหลว ... ฉันพยายามที่จะไม่อ้างอิง ATTACH ... สองครั้ง> _ <
Doktor J

162

เพื่อแสดงตารางทั้งหมดใช้

SELECT name FROM sqlite_master WHERE type = "table"

เพื่อแสดงแถวทั้งหมดฉันเดาว่าคุณสามารถวนซ้ำทุกตารางและเลือก SELECT * ในแต่ละแถว แต่บางทีการถ่ายโอนข้อมูลเป็นสิ่งที่คุณหลังจาก?


16
ขอบคุณสำหรับคำตอบเดียวที่ตอบคำถามจริงๆ ... "SQL อะไร" ไม่ใช่คำสั่งอะไรที่สามารถใช้ ... ขอบคุณ!
Brad Parks

นอกจากนี้จะพิมพ์ชื่อตารางหนึ่งชื่อต่อบรรทัดในขณะที่. tables จะพิมพ์คอลัมน์ชื่อตารางหลายคอลัมน์ (น่ารำคาญ / ไม่มีประโยชน์)
เชน

68

ใช้.helpสำหรับตรวจสอบคำสั่งต่างๆ

.table

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


แปลกมันต้องถูกต้อง แต่ใช้ไม่ได้เมื่อฉันใช้
Jürgen K.

42

มีคำสั่งสำหรับสิ่งนี้ในบรรทัดคำสั่ง SQLite:

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

ซึ่งแปลงเป็น SQL ต่อไปนี้:

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

หากต้องการแสดงรายการตารางที่คุณสามารถทำได้:

SELECT name FROM sqlite_master
WHERE type='table';

ดังนั้น ... cur.execute(""" SELECT name FROM sqlite_master WHERE type='table';""")หรือไม่ ไม่ทำงานสำหรับฉัน แต่ฉันไม่แน่ใจว่ารหัสนี้ควรจะทำงานที่ไหน
jbuddy_13

32

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


2
นี่อาจเป็นวิธีที่ดีที่สุดที่จะทำ
Alix Axel

7
ใช้งานได้ก็ต่อเมื่อคุณรู้ชื่อของตาราง คุณไม่สามารถใช้สิ่งนี้เพื่อรับรายการชื่อตาราง
Eric W

24

ฉันใช้แบบสอบถามนี้เพื่อรับ:

SELECT name FROM sqlite_master WHERE type='table'

และเพื่อใช้ใน iOS:

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

16

จากเอกสารอ้างอิงเทียบเท่ากับ MySQLs SHOW TABLES;คือ:

คำสั่ง ".tables" คล้ายกับการตั้งค่าโหมดรายการจากนั้นดำเนินการแบบสอบถามต่อไปนี้:

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;

อย่างไรก็ตามหากคุณกำลังตรวจสอบว่ามีตารางเดียว (หรือเพื่อดูรายละเอียด) ให้ดู@LuizGeron answer


15

จาก SQLite 3 เวอร์ชันล่าสุดคุณสามารถออก:

.fullschema

เพื่อดูคำสั่งสร้างของคุณทั้งหมด


SQLite เวอร์ชั่น 3.7.13 2012-07-17 17:46:21 ป้อน ".help" สำหรับคำแนะนำป้อนคำสั่ง SQL ที่ลงท้ายด้วย ";" sqlite> .fullschema ข้อผิดพลาด: คำสั่งที่ไม่รู้จักหรืออาร์กิวเมนต์ที่ไม่ถูกต้อง: "fullschema" ป้อน ".help" เพื่อขอความช่วยเหลือ
Mona Jalal

2
คุณกำลังใช้เวอร์ชันตั้งแต่ปี 2012
พริกไทย

12

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการเปิดฐานข้อมูลโดยตรงและใช้.dumpคำสั่งแทนที่จะแนบหลังจากเรียกใช้เครื่องมือเชลล์ SQLite 3

ดังนั้น ... (สมมติว่าบรรทัดคำสั่งระบบปฏิบัติการของคุณคือ $) แทนที่จะเป็น$sqlite3:

sqlite3> ATTACH database.sqlite as "attached"

จากบรรทัดคำสั่งระบบปฏิบัติการของคุณเปิดฐานข้อมูลโดยตรง:

$sqlite3 database.sqlite
sqlite3> .dump

10

ผ่าน a union allรวมตารางทั้งหมดไว้ในรายการเดียว

select name
from sqlite_master 
where type='table'

union all 

select name 
from sqlite_temp_master 
where type='table'


7

เนื่องจากไม่มีใครพูดถึงการอ้างอิงอย่างเป็นทางการของ SQLite ฉันคิดว่ามันอาจมีประโยชน์ที่จะอ้างถึงมันภายใต้หัวข้อนี้:

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

คุณสามารถจัดการฐานข้อมูลของคุณโดยใช้คำสั่งที่อธิบายไว้ในลิงค์นี้ นอกจากนี้หากคุณใช้ระบบปฏิบัติการ Windowsและไม่ทราบว่าคำสั่งเชลล์อยู่ที่ไหนในไซต์ของ SQLite:

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

หลังจากดาวน์โหลดมันคลิกที่ไฟล์ sqlite3.exe ในการเริ่มต้นเชลล์คำสั่งของ เมื่อถูกเตรียมใช้งานโดยค่าเริ่มต้นเซสชัน SQLite นี้กำลังใช้ฐานข้อมูลในหน่วยความจำไม่ใช่ไฟล์บนดิสก์ดังนั้นการเปลี่ยนแปลงทั้งหมดจะหายไปเมื่อออกจากเซสชัน ในการใช้ไฟล์ดิสก์ถาวรเป็นฐานข้อมูลให้ป้อนคำสั่ง ".open ex1.db" ทันทีหลังจากหน้าต่างเทอร์มินัลเริ่มทำงาน

ตัวอย่างด้านบนทำให้ไฟล์ฐานข้อมูลชื่อ "ex1.db" ถูกเปิดและใช้งานและสร้างขึ้นหากไม่มีอยู่ก่อนหน้านี้ คุณอาจต้องการใช้ชื่อพา ธ แบบเต็มเพื่อให้แน่ใจว่าไฟล์อยู่ในไดเรกทอรีที่คุณคิดว่าเป็นชื่อนั้นใช้เครื่องหมายทับหน้าเป็นตัวคั่นไดเรกทอรี กล่าวอีกนัยหนึ่งใช้ "c: /work/ex1.db" ไม่ใช่ "c: \ work \ ex1.db"

หากต้องการดูตารางทั้งหมดในฐานข้อมูลที่คุณเลือกไว้ก่อนหน้านี้ให้พิมพ์คำสั่ง. tableตามที่กล่าวไว้ในลิงค์ด้านบน

หากคุณทำงานใน Windows ฉันคิดว่าอาจเป็นประโยชน์ในการย้ายไฟล์ sqlite.exe นี้ไปยังโฟลเดอร์เดียวกันกับไฟล์ Python อื่น ๆ ด้วยวิธีนี้ไฟล์ Python จะเขียนและ SQLite shell อ่านจากไฟล์. db อยู่ในพา ธ เดียวกัน


5

คำสั่ง ".schema" จะแสดงรายการตารางและแถวที่มีอยู่โดยแสดงคำสั่งที่ใช้สร้างตารางดังกล่าว:

sqlite> สร้าง table_a (id int, int, b int);
sqlite> .schema table_a
สร้าง table_a table (id int, int, b int);

1

.da เพื่อดูฐานข้อมูลทั้งหมด - หนึ่งชื่อ ' main '

ตารางของฐานข้อมูลนี้สามารถมองเห็นได้ด้วย

เลือก tbl_name ที่แตกต่างจากคำสั่ง sqlite_master โดย 1;

ฐานข้อมูลที่แนบมาจำเป็นต้องใส่คำนำหน้าที่คุณเลือกด้วย AS ในคำสั่ง ATTACH เช่นaa (, bb, cc ... ) ดังนั้น:

เลือก tbl_name ที่แตกต่างจากคำสั่งaa.sqlite_masterโดย 1;

โปรดทราบว่าที่นี่คุณจะได้รับมุมมองเช่นกัน หากต้องการยกเว้นการเพิ่มเหล่านี้ โดยที่ type = 'table' ก่อนหน้า 'order'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.