Làm thế nào để định dạng đúng đầu ra vỏ sqlite?


79

Nếu tôi đi đến mysql shellvà gõ SELECT * FROM userstôi nhận được -

+--------+----------------+---------------------------------+----------+-----------+--------------------+--------------------+
| 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 trình diễn -

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 trình diễn -

137|X|b@cc.com|#|ADMIN|166|110
138|Kshitiz|ksharma@aaa.com|asdf|ADMIN|167|111
  1. Có cách nào để làm đẹp đầu ra từ sqlite shell?
  2. Có một vỏ thay thế tốt hơn phân phối mặc định? (Chỉ khách hàng CLI)

định dạng đầu ra thực sự tùy chỉnh: stackoverflow.com/questions/23120906/ Từ
Ciro Santilli 改造 心 心

Câu trả lời:


113

Đối với đầu ra "con người có thể đọc được", bạn có thể sử dụng columnchế độ và bật đầu ra tiêu đề. Điều đó sẽ giúp bạn có một cái gì đó tương tự như sqlplusđầu ra trong các ví dụ của bạn:

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

Những lời cảm ơn tốt đẹp! Nội dung không phù hợp (theo chiều ngang) và dường như không có máy nhắn tin tích hợp, vì vậy tôi phải sử dụng echo -e '.mode column\n.headers on\nselect * from sip_foo;\n' | sqlite3 database.sqlite | less -Sđể có được một hàng trên mỗi dòng mà không cần bọc từ.
Rob W

5
Lưu ý, tuy nhiên, bạn có thể cần phải sử dụng .widthlệnh để làm cho các cột của bạn rộng hơn. Khác nội dung của bạn sẽ được cắt ngắn trực quan.
mlissner

Bạn cũng có thể muốn thêm .separator ROW "\n", để các hàng được phân tách bằng dấu ngắt dòng. Của tôi thì không, và đầu ra thì không thể đọc được.
Boxuan

3
Bạn có thể thêm ~/.sqliterctệp này vào tệp của mình nếu bạn không muốn làm thủ công mỗi lần.
ijoseph

9

Đối với những người quan tâm đến việc có được kết quả tương tự, ngoại trừ chạy sqlite từ dòng lệnh. Tôi thấy rằng những điều sau đây không hoạt động:

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

Thay vào đó, bạn phải sử dụng các tùy chọn -column và -header với lệnh sqlite như sau:

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

Sử dụng:

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

1
Mặc dù không có tùy chọn để đặt chiều rộng cột, nhưng cách giải quyết sau đây là có thể: echo -e ".headers on \n.mode column \n.width 10 20 500 \n select * from MyTable" | sqlite3 <dbfile>- tức là gửi các lệnh đến stdin.
ruvim

Tôi nghĩ rằng lỗi của bạn là sử dụng dấu chấm phẩy thay vì ".headers on\n.mode column\nvv
deed02392

9

Tất cả các câu trả lời đều cung cấp các cài đặt bạn có thể nhập vào bảng điều khiển SQLite hoặc thông qua CLI, nhưng không ai đề cập rằng các cài đặt này có thể được đưa vào tệp RC để tránh phải nhập chúng mọi lúc. Lưu cái này dưới dạng ~/.sqliterc:

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

Lưu ý Tôi cũng đã thêm một trình giữ chỗ cho các giá trị null, thay vì chuỗi trống mặc định.


2

Tôi luôn luôn sử dụng

.mode line

trong đó in kết quả truy vấn theo chiều dọc, tương tự như công cụ \Gsửa đổi của MySQL .


1

Như tôi chưa thể nhận xét ... Ngoài các câu trả lời tuyệt vời đã được cung cấp bởi Mat và mlissner, nếu trong mọi trường hợp, nội dung của một cột bị cắt ngắn, sau khi đưa ra định dạng đúng cho shell sqlite (sử dụng .mode column.headers onnhư đã nêu ở trên ), cũng có khả năng sử dụng .explainđể nội dung đầy đủ của một cột được hiển thị.

Nhược điểm duy nhất của lệnh này là các tiêu đề cột co lại, do đó không đọc chúng đúng cách và đầu ra có thể khá lộn xộn (trong một kịch bản trực quan), sau đó bạn có thể sử dụng .explain offđể quay lại định dạng trước đó và xem nó với "con người hơn" định dạng có thể đọc được một lần nữa.

Cách tiếp cận này có thể được sử dụng cùng với các lệnh của trình định dạng đầu ra và như một giải pháp tạm thời để xem toàn bộ dữ liệu của cơ sở dữ liệu / cột, vì với việc sử dụng .widthbạn luôn phải đưa ra số lượng ký tự chính xác để có được đầu ra đầy đủ dữ liệu của một cột.

Để biết thêm thông tin về việc thay đổi định dạng đầu ra, hãy tham khảo nhanh tài liệu CLI mặc định:

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


1

Của tôi trông giống như một mớ hỗn độn không có ngắt dòng. @Boxuan bình luận về

Bạn cũng có thể muốn thêm .separator ROW "\ n", để các hàng được phân tách bằng dấu ngắt dòng. Của tôi thì không, và đầu ra thì không thể đọc được. - Boxuan ngày 11 tháng 5 lúc 15:08

Đã sửa vấn đề của tôi với nónhập mô tả hình ảnh ở đây


1
Bạn đang sử dụng hệ thống nào? trên macOS không có vấn đề như vậy
ospider

1

Bạn có thể sử dụng .mode tabscho thuận tiện.

sqlite> select * from user;
name    age
Bob     18
Ali     19
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.