Sqlite kabuk çıktısını düzgün biçimde nasıl formatlayabilirim?


78

Ben giderseniz mysql shellve yazın SELECT * FROM usersalıyorum -

+--------+----------------+---------------------------------+----------+-----------+--------------------+--------------------+
| 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 gösterir -

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 gösterir -

137|X|b@cc.com|#|ADMIN|166|110
138|Kshitiz|ksharma@aaa.com|asdf|ADMIN|167|111
  1. Çıktısını güzelleştirmenin bir yolu var mı sqlite shell?
  2. Varsayılan dağıtımdan daha iyi bir alternatif kabuk var mı? (Yalnızca CLI müşterileri)

gerçekten özel çıktı formatı: stackoverflow.com/questions/23120906/…
Ciro Santilli

Yanıtlar:


112

"İnsan tarafından okunabilir" çıktı için, columnmodu kullanabilir ve başlık çıktısını açabilirsiniz. Bu sqlplussize örneklerinizdeki çıktıya benzer bir şey verecektir :

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

Güzel teşekkürler! İçerik sığmadı (yatay olarak) ve yerleşik bir çağrı cihazı görünmüyordu, bu yüzden echo -e '.mode column\n.headers on\nselect * from sip_foo;\n' | sqlite3 database.sqlite | less -Skelime kaydırma olmadan satır başına bir satır almak zorunda kaldım .
Rob W

5
Ancak, .widthsütunları genişletmek için bu komutu kullanmanız gerekebileceğini unutmayın . Aksi halde içeriğiniz görsel olarak kesilecektir.
mlissner

Ayrıca .separator ROW "\n"satırları satır kesmeleriyle ayıracak şekilde eklemek isteyebilirsiniz . Mine değildi ve çıktı okunamıyordu.
Boxuan

3
Bunu ~/.sqlitercher seferinde el ile yapmak istemiyorsanız bunu dosyanıza ekleyebilirsiniz .
ijoseph

9

Komut satırından sqlite çalıştırmak dışında aynı sonuçları elde etmek isteyenler için. Aşağıdakilerin işe yaramadığını öğrendim:

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

Bunun yerine, -column ve -header seçeneklerini sqlite komutuyla aşağıdaki gibi kullanmanız gerekir:

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

Kullanımı:

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

1
Sütun genişliğini ayarlama seçeneği bulunmamakla birlikte, aşağıdaki geçici çözüm mümkündür: echo -e ".headers on \n.mode column \n.width 10 20 500 \n select * from MyTable" | sqlite3 <dbfile>- yani komutları stdin'e gönderin.
ruvim

Sanırım ".headers on\n.mode column\n
hatanız

9

Tüm cevaplar, SQLite konsoluna veya CLI yoluyla yazabileceğiniz ayarları sağlar, ancak hiç kimse bunları yazmak zorunda kalmamak için bu ayarların bir RC dosyasına yerleştirilebileceğinden bahsetmez. Bunu farklı kaydet ~/.sqliterc:

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

Not Ayrıca, varsayılan boş dize yerine boş değerler için bir yer tutucu ekledim.


2

Ben her zaman kullanırım

.mode line

Bu, MySQL'in \Gdeğiştiricisine benzer şekilde, sorgu sonuçlarını dikey olarak basar .


1

Henüz yorum yapamadığım gibi ... Mat ve mlissner tarafından zaten verilen büyük cevaplara ek olarak, herhangi bir durumda bir sütunun içeriği kesiliyorsa, sqlite kabuğuna doğru formatı verdikten sonra ( yukarıda .mode columnve .headers onyukarıda belirtilen şekilde kullanın) ), ayrıca .explainbir sütunun tüm içeriğinin gösterilmesi için kullanma imkanı da vardır .

Bu komutun tek dezavantajı, sütun başlıklarının daralmasıdır, bu nedenle bunları düzgün bir şekilde okumaz ve çıktı oldukça karışık olabilir (görsel bir senaryoda), daha sonra .explain offönceki formata dönmek ve daha "insan" ile görüntülemek için kullanabilirsiniz bir kez daha okunabilir "biçim.

Bu yaklaşım çıktı biçimleyici komutları ile birlikte kullanılabilir ve kullanımda olduğu gibi bir veritabanının / sütunun verisinin tamamını görüntülemek için geçici bir çözüm olarak, kullanımın .widthher zaman tam çıktısını elde etmek için her zaman kesin karakter sayısını vermeniz gerekir. bir sütunun verileri.

Çıktı biçimlerini değiştirme hakkında daha fazla bilgi için, varsayılan CLI belgelerine hızlı bir başvuru:

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


1

Mine, satır sonu olmadan dağınık gibiydi. @ Boxuan yorumu

Ayrıca satırları satır kesmeleriyle ayıracak şekilde .separator ROW "\ n" eklemek isteyebilirsiniz. Mine değildi ve çıktı okunamıyordu. - Boxuan 11 Mayıs, 15:08

Benim sorunum da düzeltildigörüntü tanımını buraya girin


1
Hangi sistemi kullanıyorsunuz? macOS üzerinde böyle bir sorun yok
ospider

1

.mode tabsRahatlık için kullanabilirsiniz .

sqlite> select * from user;
name    age
Bob     18
Ali     19
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.