Bagaimana memformat output shell sqlite dengan benar?

79

Jika saya pergi ke mysql shelldan ketik SELECT * FROM userssaya dapatkan -

+--------+----------------+---------------------------------+----------+-----------+--------------------+--------------------+
| 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 menunjukkan -

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 menunjukkan -

137|X|b@cc.com|#|ADMIN|166|110
138|Kshitiz|ksharma@aaa.com|asdf|ADMIN|167|111
  1. Apakah ada cara untuk mempercantik hasil dari sqlite shell?
  2. Apakah ada shell alternatif yang lebih baik daripada distribusi default? (Khusus klien CLI)
Kshitiz Sharma
sumber
format keluaran yang benar-benar tersuai: stackoverflow.com/questions/23120906/…
Ciro Santilli 改造 改造 中心 法轮功 六四 事件

Jawaban:

114

Untuk output "dapat dibaca manusia", Anda dapat menggunakan columnmode, dan aktifkan output header. Itu akan memberi Anda sesuatu yang mirip dengan sqlplusoutput dalam contoh Anda:

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
Tikar
sumber
Cantik, terima kasih! Konten tidak cocok (horizontal), dan sepertinya tidak ada pager bawaan, jadi saya harus menggunakan echo -e '.mode column\n.headers on\nselect * from sip_foo;\n' | sqlite3 database.sqlite | less -Suntuk mendapatkan satu baris per baris tanpa bungkus kata.
Rob W
5
Namun, perhatikan bahwa Anda mungkin perlu menggunakan .widthperintah untuk membuat kolom Anda lebih luas. Jika tidak, konten Anda akan terpotong secara visual.
mlissner
Anda mungkin juga ingin menambahkan .separator ROW "\n", sehingga baris dipisahkan oleh jeda baris. Milik saya tidak, dan hasilnya tidak dapat dibaca.
Boxuan
3
Anda dapat menambahkan ini ke ~/.sqlitercfile Anda jika Anda tidak ingin melakukannya secara manual setiap saat.
ijoseph
10

Bagi mereka yang tertarik untuk mendapatkan hasil yang sama, kecuali menjalankan sqlite dari baris perintah. Saya menemukan bahwa yang berikut ini tidak berfungsi:

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

Sebagai gantinya, Anda harus menggunakan opsi -column dan -header dengan perintah sqlite sebagai berikut:

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

Menggunakan:

$ sqlite3 --version 3.8.11.1 2015-07-29 20:00:57 cf538e2783e468bbc25e7cb2a9ee64d3e0e80b2f
kacang jersey
sumber
1
Meskipun tidak ada opsi untuk mengatur lebar kolom, solusi berikut dimungkinkan: echo -e ".headers on \n.mode column \n.width 10 20 500 \n select * from MyTable" | sqlite3 <dbfile>- yaitu, mengirim perintah ke stdin.
ruvim
Saya pikir kesalahan Anda menggunakan titik koma alih-alih ".headers on\n.mode column\ndll
deed02392
@ruvim atau gunakan .mode csvatau -csvdari CLI
qwr
10

Semua jawaban memberikan pengaturan yang dapat Anda ketik di konsol SQLite atau melalui CLI, tetapi tidak ada yang menyebutkan bahwa pengaturan ini dapat dimasukkan ke dalam file RC untuk menghindari keharusan mengetiknya sepanjang waktu. Simpan ini sebagai ~/.sqliterc:

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

Catatan Saya juga menambahkan pengganti untuk nilai-nilai nol, alih-alih string kosong default.

miken32
sumber
3

Saya selalu menggunakan

.mode line

yang mencetak hasil kueri secara vertikal, mirip dengan \Gpengubah MySQL .

Geoff_Clapp
sumber
1

Karena saya belum bisa berkomentar ... Selain jawaban-jawaban hebat yang sudah disediakan oleh Mat dan mlissner, jika dalam hal apa pun isi kolom terpotong, setelah memberikan format yang tepat ke shell sqlite (menggunakan .mode columndan .headers onseperti yang dinyatakan di atas ), ada juga kemungkinan untuk digunakan .explainsehingga konten lengkap kolom ditampilkan.

Satu-satunya downside ke perintah ini adalah bahwa header kolom menyusut, sehingga tidak membacanya dengan benar dan hasilnya bisa sangat berantakan (dalam skenario visual), maka Anda dapat menggunakan .explain offuntuk kembali ke format sebelumnya dan melihatnya dengan lebih "manusia" format yang dapat dibaca "sekali lagi.

Pendekatan ini dapat digunakan bersama dengan perintah formatters output, dan sebagai solusi sementara untuk melihat data lengkap dari database / kolom, karena dengan penggunaan .widthAnda selalu harus memberikan jumlah karakter yang tepat untuk mendapatkan output penuh dari data kolom.

Untuk info lebih lanjut tentang mengubah format output, referensi cepat ke dokumentasi CLI default:

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

Cho-Lung
sumber
1

Milik saya tampak seperti berantakan tanpa putus garis. @ Boxuan mengomentari

Anda mungkin juga ingin menambahkan .separator ROW "\ n", sehingga baris-baris dipisahkan oleh jeda baris. Milik saya tidak, dan hasilnya tidak dapat dibaca. - Boxuan 11 Mei pukul 15:08

Memperbaiki masalah saya dengannya jugamasukkan deskripsi gambar di sini

superheron
sumber
1
Sistem mana yang Anda gunakan? pada macOS tidak ada masalah seperti itu
ospider
1

Anda dapat menggunakannya .mode tabsuntuk kenyamanan.

sqlite> select * from user;
name    age
Bob     18
Ali     19
Kevin
sumber