Comment formater correctement la sortie du shell sqlite?

79

Si je vais à mysql shellet tapez SELECT * FROM usersje reçois -

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

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

137|X|b@cc.com|#|ADMIN|166|110
138|Kshitiz|ksharma@aaa.com|asdf|ADMIN|167|111
  1. Existe-t-il un moyen d’embellir le résultat sqlite shell?
  2. Existe-t-il un shell alternatif meilleur que la distribution par défaut? (Clients CLI uniquement)
Kshitiz Sharma
la source
Format de sortie vraiment personnalisé: stackoverflow.com/questions/23120906/…
Ciro Santilli a écrit:

Réponses:

115

Pour une sortie "lisible par l'homme", vous pouvez utiliser le columnmode et activer la sortie d'en-tête. Cela vous donnera quelque chose de similaire à la sqlplussortie dans vos exemples:

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
Tapis
la source
Beau, merci! Le contenu ne cadrait pas (horizontalement), et il ne semble pas y avoir de pager intégré, je devais donc utiliser echo -e '.mode column\n.headers on\nselect * from sip_foo;\n' | sqlite3 database.sqlite | less -Spour obtenir une ligne par ligne sans retour à la ligne.
Rob W
5
Notez cependant que vous devrez peut-être utiliser la .widthcommande pour élargir vos colonnes. Sinon, votre contenu sera tronqué visuellement.
mlissner
Vous pouvez également ajouter des éléments .separator ROW "\n"pour que les lignes soient séparées par des sauts de ligne. Le mien n'était pas, et la sortie était illisible.
Boxuan
3
Vous pouvez ajouter ceci à votre ~/.sqlitercfichier si vous ne voulez pas le faire manuellement à chaque fois.
ijoseph
11

Toutes les réponses fournissent des paramètres que vous pouvez taper sur la console SQLite ou via la CLI, mais personne ne mentionne que ces paramètres peuvent être placés dans un fichier RC pour éviter d'avoir à les saisir tout le temps. Enregistrez ceci sous ~/.sqliterc:

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

Remarque J'ai également ajouté un espace réservé pour les valeurs null au lieu de la chaîne vide par défaut.

miken32
la source
10

Pour ceux qui sont intéressés à obtenir les mêmes résultats, à l'exception de l'exécution de sqlite à partir de la ligne de commande. J'ai trouvé que ce qui suit ne fonctionne pas:

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

A la place, vous devez utiliser les options -column and -header avec la commande sqlite comme suit:

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

En utilisant:

$ sqlite3 --version 3.8.11.1 2015-07-29 20:00:57 cf538e2783e468bbc25e7cb2a9ee64d3e0e80b2f
haricot jersey
la source
1
Bien qu'il n'y ait pas d'option pour définir la largeur des colonnes, la solution de contournement suivante est possible: echo -e ".headers on \n.mode column \n.width 10 20 500 \n select * from MyTable" | sqlite3 <dbfile>- c.-à-d., Envoyez les commandes au stdin.
Ruvim
Je pense que votre erreur a été d'utiliser des points-virgules au lieu de ".headers on\n.mode column\netc.
deed02392
@ruvim ou use .mode csvou -csvde la CLI
qwr
3

J'utilise toujours

.mode line

qui affiche les résultats de la requête verticalement, comme le \Gmodificateur de MySQL .

Geoff_Clapp
la source
1

Comme je ne peux pas encore commenter ... En plus des bonnes réponses déjà fournies par Mat et mlissner, si dans tous les cas le contenu d'une colonne est tronqué, après avoir donné le bon format au shell sqlite (avec .mode columnet .headers oncomme indiqué ci-dessus ), il est également possible d’utiliser .explainle contenu complet d’une colonne.

Le seul inconvénient de cette commande est que les en-têtes de colonnes sont rétrécis. Par conséquent, si vous ne les lisez pas correctement et que le résultat risque d’être relativement désordonné (dans un scénario visuel), vous pouvez alors utiliser .explain offle retour au format précédent et l’afficher avec un affichage plus "humain". lisible "format une fois de plus.

Cette approche peut être utilisée conjointement avec les commandes de formatage en sortie, et comme solution temporaire pour afficher les données complètes d'une base de données / colonne, car .widthvous devez toujours indiquer le nombre exact de caractères pour obtenir le résultat complet. les données d'une colonne.

Pour plus d'informations sur la modification des formats de sortie, reportez-vous à la documentation CLI par défaut:

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

Cho-Lung
la source
1

Le mien ressemblait à un foutu pas de lignes. @Boxuan commente

Vous pouvez également vouloir ajouter .separator ROW "\ n" pour que les lignes soient séparées par des sauts de ligne. Le mien n'était pas, et la sortie était illisible. - Boxuan le 11 mai à 15h08

Correction de mon problème avec elle aussientrez la description de l'image ici

superheron
la source
1
Quel système utilisez-vous? sur macOS pas de problème de ce type
lecteur
1

Vous pouvez utiliser .mode tabspour plus de commodité.

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