วิธีการจัดรูปแบบเอาต์พุตเชลล์ sqlite อย่างถูกต้อง?


78

ถ้าฉันไปที่mysql shellและพิมพ์SELECT * FROM usersฉันจะได้รับ -

+--------+----------------+---------------------------------+----------+-----------+--------------------+--------------------+
| USERID | NAME           | EMAILID                         | PASSWORD | USER_TYPE | CONTACT_ID_FKUSERS | COMPANY_ID_FKUSERS |
+--------+----------------+---------------------------------+----------+-----------+--------------------+--------------------+
|    137 | X              | b@cc.com                        | #        | ADMIN     |                166 |                110 |
|    138 | Kshitiz        | ksharma@aaa.com                 | asdf     | ADMIN     |                167 |                111 |
+--------+----------------+---------------------------------+----------+-----------+--------------------+--------------------+

Oracle sqlplus รายการ -

USERID     NAME  EMAILID    PASSWORD   USER_TYPE  CONTACT_ID_FKUSERS COMPANY_ID_FKUSERS
---------- ----- ---------- ---------- ---------- ------------------ ------------------
137        X     b@cc.com   #          ADMIN                     166                110
137        X     b@cc.com   #          ADMIN                     166                110

Sqlite shell รายการ -

137|X|b@cc.com|#|ADMIN|166|110
138|Kshitiz|ksharma@aaa.com|asdf|ADMIN|167|111
  1. มีวิธีในการตกแต่งผลลัพธ์จากsqlite shellหรือไม่
  2. มีเปลือกสำรองที่ดีกว่าการกระจายเริ่มต้นหรือไม่ (ลูกค้า CLI เท่านั้น)

รูปแบบเอาต์พุตที่กำหนดเองอย่างแท้จริง: stackoverflow.com/questions/23120906/ …
Ciro Santilli 事件改造中心中心法轮功六四事件

คำตอบ:


112

สำหรับเอาต์พุต "human readable" คุณสามารถใช้columnโหมดและเปิดเอาต์พุตส่วนหัว คุณจะได้รับสิ่งที่คล้ายกับsqlplusผลลัพธ์ในตัวอย่างของคุณ:

sqlite> select * from foo;
234|kshitiz|dba.se
sqlite> .mode column
sqlite> select * from foo;
234         kshitiz     dba.se
sqlite> .headers on
sqlite> select * from foo;
bar         baz         baf
----------  ----------  ----------
234         kshitiz     dba.se

สวยขอบคุณ! เนื้อหาไม่พอดี (แนวนอน) และดูเหมือนจะไม่มีเพจเจอร์ในตัวดังนั้นฉันต้องใช้echo -e '.mode column\n.headers on\nselect * from sip_foo;\n' | sqlite3 database.sqlite | less -Sเพื่อรับหนึ่งแถวต่อบรรทัดโดยไม่มีการตัดคำ
Rob W

5
อย่างไรก็ตามโปรดทราบว่าคุณอาจต้องใช้.widthคำสั่งเพื่อทำให้คอลัมน์ของคุณกว้างขึ้น มิฉะนั้นเนื้อหาของคุณจะถูกตัดทอนด้วยสายตา
mlissner

คุณอาจต้องการเพิ่ม.separator ROW "\n"เพื่อให้แถวถูกคั่นด้วยตัวแบ่งบรรทัด ฉันไม่ได้และเอาท์พุทก็อ่านไม่ได้
Boxuan

3
คุณสามารถเพิ่มสิ่งนี้ลงใน~/.sqlitercไฟล์ของคุณหากคุณไม่ต้องการทำสิ่งนี้ด้วยตนเองทุกครั้ง
ijoseph

9

สำหรับผู้ที่สนใจรับผลลัพธ์เดียวกันยกเว้นการเรียกใช้ sqlite จากบรรทัดคำสั่ง ฉันพบว่าสิ่งต่อไปนี้ใช้งานไม่ได้:

$ sqlite3 <dbfile> ".headers on;.mode column;select * from MyTable"
Error: mode should be one of: ascii column csv html insert line list tabs tcl

แต่คุณต้องใช้ตัวเลือก -column และ -header ด้วยคำสั่ง sqlite ดังต่อไปนี้:

$ sqlite3 -column -header <dbfile> "select * from MyTable"

โดยใช้:

$ sqlite3 --version 3.8.11.1 2015-07-29 20:00:57 cf538e2783e468bbc25e7cb2a9ee64d3e0e80b2f

1
แม้ว่าจะไม่มีตัวเลือกในการตั้งค่าความกว้างของคอลัมน์วิธีแก้ปัญหาต่อไปนี้เป็นไปได้: echo -e ".headers on \n.mode column \n.width 10 20 500 \n select * from MyTable" | sqlite3 <dbfile>- เช่นส่งคำสั่งไปยัง stdin
ruvim

ฉันคิดว่าข้อผิดพลาดของคุณกำลังใช้เครื่องหมายอัฒภาคแทน".headers on\n.mode column\nฯลฯ
deed02392

9

คำตอบทั้งหมดให้การตั้งค่าที่คุณสามารถพิมพ์ได้ที่คอนโซล SQLite หรือผ่านทาง CLI แต่ไม่มีใครพูดถึงว่าสามารถใส่การตั้งค่าเหล่านี้ลงในไฟล์ RC เพื่อหลีกเลี่ยงการพิมพ์ตลอดเวลา บันทึกเป็น~/.sqliterc:

.mode column
.headers on
.separator ROW "\n"
.nullvalue NULL

หมายเหตุฉันได้เพิ่มตัวยึดตำแหน่งสำหรับค่า Null แทนที่จะเป็นสตริงว่างเริ่มต้น


2

ฉันมักจะใช้

.mode line

ซึ่งพิมพ์ผลลัพธ์แบบสอบถามในแนวตั้งคล้ายกับ\Gตัวแก้ไขของ MySQL


1

ในขณะที่ฉันยังไม่สามารถแสดงความคิดเห็น ... นอกจากคำตอบที่ยอดเยี่ยมที่ได้รับจาก Mat และ mlissner แล้วในกรณีใด ๆ เนื้อหาของคอลัมน์จะถูกตัดทอนหลังจากให้รูปแบบที่ถูกต้องกับ sqlite shell (ใช้.mode columnและ.headers onตามที่ระบุไว้ข้างต้น ) นอกจากนี้ยังมีความเป็นไปได้ที่จะใช้.explainเพื่อแสดงเนื้อหาทั้งหมดของคอลัมน์

ข้อเสียเพียงอย่างเดียวของคำสั่งนี้คือส่วนหัวของคอลัมน์ลดขนาดดังนั้นจึงไม่สามารถอ่านได้อย่างถูกต้องและเอาต์พุตอาจยุ่งมาก (ในสถานการณ์ที่เป็นภาพ) จากนั้นคุณสามารถใช้.explain offเพื่อกลับไปยังรูปแบบก่อนหน้า รูปแบบที่อ่านได้อีกครั้ง

วิธีการนี้สามารถใช้ร่วมกับคำสั่งตัวจัดรูปแบบผลลัพธ์และเป็นวิธีแก้ปัญหาชั่วคราวเพื่อดูข้อมูลทั้งหมดของฐานข้อมูล / คอลัมน์เช่นเดียวกับการใช้งานของ.widthคุณจะต้องให้จำนวนอักขระที่แม่นยำเพื่อให้ได้ผลลัพธ์เต็มของ ข้อมูลของคอลัมน์

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนรูปแบบเอาต์พุตการอ้างอิงด่วนไปยังเอกสารคู่มือ CLI เริ่มต้น:

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


1

ฉันดูเหมือนจะยุ่งเหยิงโดยไม่มีการขึ้นบรรทัดใหม่ @Boxuan แสดงความคิดเห็นบน

คุณอาจต้องการเพิ่ม. separator ROW "\ n" เพื่อให้แถวถูกคั่นด้วยตัวแบ่งบรรทัด ฉันไม่ได้และเอาท์พุทก็อ่านไม่ได้ - Boxuan 11 พฤษภาคมเวลา 15:08 น

แก้ไขปัญหาของฉันด้วยเช่นกันป้อนคำอธิบายรูปภาพที่นี่


1
คุณใช้ระบบไหน ใน macOS ไม่มีปัญหาดังกล่าว
ospider

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