sqliteシェル出力を適切にフォーマットする方法は?


79

にアクセスし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クライアントのみ)

回答:


113

「人間が読める」出力の場合、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ワードラップなしで1行に1行を取得する必要がありました。
ロブ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>つまり、コマンドを標準入力に送信します。
-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

MySQLの\G修飾子と同様に、クエリ結果を垂直に出力します。


1

私はコメントはまだ...すでにマットとmlissnerが提供する偉大な答えに加えて、どのような場合には、列の内容はsqliteのシェルに適切なフォーマットを与えた後、切り捨てられた場合(使用しないように.mode columnし、.headers on上記のように)、使用する可能性もある.explainため、列の完全なコンテンツが表示されます。

このコマンドへの唯一の欠点は、列ヘッダが縮小ということであるので、それらを適切に読んでいないと、出力は(視覚的なシナリオでは)非常に厄介なことができ、あなたが使用することができ.explain off、以前の形式に戻りますし、より多くの「人間とそれを見ます読み取り可能」フォーマットをもう一度。

このアプローチは、出力フォーマッタコマンドと組み合わせて使用​​できます。また、データベース/列の全データを表示する一時的なソリューションとして使用.widthできます。列のデータ。

出力形式の変更の詳細については、デフォルトのCLIドキュメントのクイックリファレンスを参照してください。

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


1

私のものは、改行なしで混乱しているように見えました。@Boxuanコメント

.separator ROW "\ n"を追加して、行を改行で区切ることもできます。私はそうではなく、出力は読めませんでした。– Boxuan 5月11日15:08

私の問題も修正しましたここに画像の説明を入力してください


1
どのシステムを使用していますか?macOSでは、このような問題はありません
オスパイダー

1

.mode tabs便利に使用できます。

sqlite> select * from user;
name    age
Bob     18
Ali     19
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.