Aller au contenu principal
Bienvenue sur Forum Puppy Linux - Toutou Linux - Astuces - Aides !
Lorsque vous n'êtes pas connectés vous pouvez visiter la totalité du forum mais avec certaines restrictions : cf le règlement pour les visiteurs non connectés. Vous êtes chaleureusement conviés à vous inscrire afin de bénéficier de toutes les fonctionnalités du forum et de participer aux échanges.
Sujet: SQLite3 (Lu 19 fois) sujet précédent - sujet suivant - Sujet provenant de SQLite3 et les conten...
0 Membres et 1 Invitédans ce sujet

SQLite3

Bonjour les addictos,

un membre du forum qui connaît mon inclinaison pour les base de données (ou BDD) signalait à ma curiosité un article en pas français, et je l'en remercie encore une fois ici.
Ce membre me taquinait, car je ne l'avais pas traduit.
C'est chose faite grâce à un traducteur un ligne dont je tairais le nom (non, ce n'est pas deepl.com).

Voici cet article dont la source peut être consultée sur https://distrowatch.com/weekly.php?issue=20251006#tips :
Citer
Utiliser SQLite pour gérer des fichiers ZIP

SQLite est un logiciel de base de données incroyablement portable, puissant et léger qui fonctionne partout, des serveurs aux smartphones. Ce qui rend SQLite si populaire, c'est qu'il fonctionne avec des fichiers de base de données autonomes qui peuvent être stockés ou transférés n'importe où. De nombreuses technologies de base de données utilisent plusieurs fichiers et nécessitent la mise en place de services réseau pour permettre aux clients d'accéder aux bases de données à distance. Contrairement à cette approche traditionnelle, une base de données SQLite est stockée dans un seul fichier qui peut exister n'importe où et être accessible sans démon dédié. Le projet SQLite fournit des bibliothèques et des outils en ligne de commande pour travailler avec ces fichiers de base de données, ce qui facilite l'accès et le partage de la base de données sans mettre en place d'infrastructure supplémentaire. Cela rend SQLite idéal pour une utilisation dans les applications de bureau, les applications téléphoniques et les petits sites web. Il y a de fortes chances que le navigateur web que vous utilisez pour lire cet article utilise des bibliothèques SQLite et une base de données SQLite.

Le site web de SQLite explique ensuite son logiciel comme suit :

SQLite est une bibliothèque en langage C qui implémente un moteur de base de données SQL petit, rapide, autonome, très fiable et complet. SQLite est le moteur de base de données le plus utilisé dans le monde. SQLite est intégré dans tous les téléphones mobiles et la plupart des ordinateurs, et est inclus dans d'innombrables autres applications que les gens utilisent tous les jours.

Aujourd'hui, je veux parler d'une fonctionnalité de SQLite qui est moins connue, mais étonnamment flexible et pratique dans certaines situations. Plus précisément, je veux parler de la façon dont l'outil en ligne de commande de SQLite peut fonctionner, non seulement avec des fichiers de base de données, mais aussi avec des fichiers ZIP.

Habituellement, lorsque nous travaillons avec des archives ZIP, c'est soit via un simple outil en ligne de commande avec une syntaxe cryptique qui crée et extrait les fichiers ZIP, soit via une application de bureau dédiée à cette tâche. SQLite offre une troisième option : un outil en ligne de commande qui peut utiliser des instructions SQL pour créer des archives, afficher des informations sur les archives et extraire des fichiers.

Je veux partager quelques exemples de SQLite en action, en travaillant avec une archive ZIP simple pour montrer à quel point SQLite est agréablement flexible. De plus, je trouve que l'utilisation des commandes de base de données SQL pour gérer un fichier ZIP est agréablement étrange et que ce genre de chose est tout simplement amusant.

Tout d'abord, créons une archive ZIP super simple à l'ancienne, via la ligne de commande. Je commence par créer quatre fichiers texte : abc, def, xyz et mnop :

$ echo "Line one" > abc; echo "Line two" > def; echo "Line three" > xyz; echo "Line four" > mnop

Maintenant que nous avons quatre fichiers texte, chacun avec une ligne de texte, nous pouvons créer notre archive ZIP et y stocker les trois premiers fichiers texte. Cela se fait avec la commande zip, comme son nom l'indique :

$ zip myarchive.zip abc def xyz
      adding: abc (stored 0%)
      adding: def (stored 0%)
      adding: xyz (stored 0%)
     
Nous pouvons confirmer que l'archive a été créée avec succès en listant son contenu dans le terminal avec le programme unzip :

$ unzip -l myarchive.zip
Archive: myarchive.zip
Length Date Time Name
--------- ---------- ----- ----
9 2025-08-12 15:21 abc
9 2025-08-12 15:21 def
11 2025-08-12 15:21 xyz

Maintenant que nous avons notre petite archive ZIP, explorons comment SQLite peut nous aider à parcourir et gérer cette archive. Nous pouvons le faire en lançant le programme sqlite et en lui passant le nom de notre fichier ZIP :

$ sqlite3 myarchive.zip
SQLite version 3.46.1 2024-08-13 09:16:08
Enter ".help" for usage hints.
sqlite>

Maintenant, le programme SQLite a ouvert notre archive ZIP et nous pouvons commencer à explorer. Comme nous allons traiter l'archive comme une base de données, SQLite attribue aux différentes fonctionnalités du fichier des noms de champs de base de données, comme nous pouvons le voir ici en utilisant la commande ".schema" :

sqlite> .schema
    CREATE VIRTUAL TABLE zip USING zipfile('myarchive.zip')
    /* zip(name,mode,mtime,sz,rawdata,data,method) */;
   
Comme on peut le voir à partir du résultat de notre commande ".schema", chaque entrée (fichier ou dossier) dans l'archive a un nom, un mode (type de fichier et permissions), une date de modification et une taille. Chaque entrée a aussi des rawdata (les informations compressées), data (les informations décompressées) et method (le niveau de compression). La plupart du temps, nous serons probablement intéressés seulement par les champs nom, taille et données.

Disons que nous voulons voir une liste des fichiers dans l'archive avec la taille décompressée de chaque fichier. Nous pouvons voir tous les fichiers dans l'archive avec leurs tailles (en octets) en utilisant une commande "select" :

sqlite> SELECT name, sz FROM zip;
abc|9
def|9
xyz|11

Dans la commande ci-dessus, nous demandons à SQLite de nous montrer (select) le nom et la taille de chaque fichier de notre archive ZIP. Le résultat est une liste des trois fichiers que nous avons placés initialement dans l'archive, avec la taille décompressée de chaque fichier.

Ensuite, que faire si nous voulons voir le contenu d’un seul de nos fichiers texte sans l’extraire de l’archive ? Nous pouvons le faire avec une autre commande "select", en indiquant que nous voulons voir les données contenues dans un fichier. Dans ce cas, nous allons demander le contenu du deuxième fichier, def :

sqlite> SELECT data FROM zip WHERE name='def';
Line two

Le résultat est le texte "Line two" que nous avions initialement mis dans le fichier texte.

Peut-être que nous voulons supprimer un des fichiers de notre archive. Dans ce cas, nous pouvons utiliser la commande SQL "delete" pour l’effacer de notre fichier ZIP. Dans cet exemple, nous supprimons le fichier def de l’archive avec la commande "delete" puis nous vérifions qu’il a disparu avec une commande "select" :

sqlite> DELETE FROM zip WHERE name='def';
sqlite> SELECT name FROM zip;
abc
xyz

Comme nous pouvons le voir dans la liste des noms ci-dessus, le fichier def a été supprimé avec succès.

Je voudrais mentionner à ce moment que les commandes SQL ne sont pas sensibles à la casse. Cela signifie que la commande "SELECT name FROM zip;" et "select name from zip;" fonctionneront toutes les deux. Les mots-clés comme "select" et "delete" sont souvent affichés en majuscules dans les exemples pour rendre les différents éléments de la commande plus visibles.

Ensuite, que faire si nous voulons ajouter un nouveau fichier à notre archive ? Nous pouvons le faire en spécifiant le nom du nouveau fichier et son contenu. Cela signifie que nous pouvons inventer le contenu sur le moment, mais il est plus probable que ce que nous voulions faire est de lire les données d'un fichier. Nous pouvons charger un fichier dans l'archive en utilisant la fonction "readfile". Ici, nous lisons le fichier mnop en mémoire et l'insérons dans l'archive :

sqlite> INSERT INTO zip(name, data) values('mnop', readfile('mnop'));

La commande ci-dessus indique à SQLite que nous voulons « insérer » un nouveau fichier. Nous lui faisons savoir que nous allons fournir le nom et les données pour la nouvelle entrée dans l'archive. Ensuite, nous devons fournir deux valeurs, le nom du nouveau fichier et son contenu. Le contenu de mnop est chargé en utilisant la fonction "readfile". Nous pouvons confirmer que la nouvelle entrée a été ajoutée en utilisant à nouveau "select" :

sqlite> select name, sz from zip;
abc|9
xyz|11
mnop|10

Nous pouvons voir le contenu de la dernière entrée en demandant le champ data de l'archive stockée sous un nom de fichier spécifique :

sqlite> select data from zip where name='mnop';
Line four

Comme nous pouvons le voir ici, le fichier mnop contenait une ligne de texte, qui lit "Line four".

Une des grandes fonctionnalités de SQLite est que l'outil en ligne de commande peut être utilisé comme un client de base de données classique, comme montré ci-dessus où nous lui donnons des commandes de manière interactive. L'outil en ligne de commande peut aussi exécuter une seule requête sur une base de données ou une archive spécifiée. Cela nous permet d'utiliser SQLite dans des scripts non interactifs ou d'extraire des informations d'une archive et de les exporter ailleurs. Par exemple, si nous voulons extraire le contenu du fichier abc de myarchive.zip et le verser dans un nouveau fichier texte, nous pouvons le faire depuis la ligne de commande, en spécifiant le nom de l'archive et la commande SQL que nous voulons exécuter :

$ sqlite3 myarchive.zip "select data from zip where name='abc'" > newabc.txt
$ cat newabc.txt
Line one

Dans l'exemple ci-dessus, nous utilisons la commande sqlite3 pour exécuter une seule commande SQL sur le fichier myarchive.zip. Cela va afficher le contenu (données) du fichier texte abc stocké dans notre archive. Nous demandons ensuite à notre shell de verser le texte dans un nouveau fichier appelé newabc.txt. Sur la deuxième ligne, nous affichons le contenu du nouveau fichier pour confirmer que cela a fonctionné.

Cette fonctionnalité en ligne de commande nous permet de réaliser des requêtes rapides, soit de manière interactive, soit depuis un script. Par exemple, la commande suivante nous indiquera combien de fichiers se trouvent dans une archive. Cela s'obtient en utilisant la fonction SQL "count" :

$ sqlite3 large-archive.zip "select count(name) from zip;"
    240
   
On peut voir qu'il y a 240 fichiers et répertoires dans l'archive ZIP large-archive.zip. Alternativement, nous pourrions obtenir la taille totale (décompressée) de tous les fichiers dans l'archive en utilisant cette commande pour obtenir la somme de la taille de chaque fichier en octets :

$ sqlite3 large-archive.zip "select sum(sz) from zip;"
235771456

Certains pourraient débattre pour savoir si utiliser SQLite est plus pratique que d'autres outils, comme zip et unzip. Les outils en ligne de commande standard (et les applications de bureau) pour travailler avec les archives sont efficaces et pratiques. Cependant, quand il s'agit de commandes portables et scriptables qui peuvent être utilisées pour interroger ou manipuler le contenu des archives, il est difficile de battre SQLite en termes de formatage fiable et de lisibilité de ses commandes.
Je retiens au moins une chose : c'est que SQLite est presque PARTOUT, selon l'auteur de l'article.
C'est comme monsieur Jourdain qui prosait sans le savoir.

J'ai voulu essayé, mais avec la version 3.7.17 2013-05-20 00:56:22 de SQLite impossible d'analyser le conteneur .zip.

Bonne journée les aminches.
Vive Toutou Linux
"Tout le monde a le droit de vivre en paix !" dit une dame africaine.

Re : SQLite3

Répondre #1
Bonjour toutes et tous et chacune et chacun (té, ça en fait du monde),

Ma version de SQLite date un peu, mais elle est extrêment légère (53 ko).
En même temps, en matière de fonctionnalités, les limites sont vite atteintes.

Ni une, ni deux, allons sur le site de SQLite.org (sqlite.org).
Là, téléchargeons les sources de la dernière version (3.53.2 à l'heure de la rédaction de ce billet).
Le .zip fait 14 Mo.
Décompactons-le et lisons le README.md.
La méthode de compilation semble simple : c'est rassurant.
Partons donc à l'aventure.

Je commence par installer le devx de Toutou SlaXen 6.0.
Pour ceux qui utilisent Triton-10 en 64 bits, il faut installer le devx de Trixie, par exemple. Pour ceux qui utilisent Focal Fossa, ben, c'est le devx de Focal Fossa. Etc.
Puis, on fait comme ils disent :
  • création d'un sous-répertoire dans le répertoire sqlite-src-3530200 ;
  • on entre dans le répertoire créé à la ligne ci-dessus ;
  • on tape joyeusement, mais énergiquement dans son terminal :
/root/Downloads/sqlite-src-3530200/SQLite3/configur

  • (Note à benêts :P  ou Nota bene : adaptez le chemin ci-dessus à votre cas)
  • il faut attendre un peu, tout dépend de votre bécane ;
  • puis, comme je ne veux que l'outil en ligne de commandes, je tambourine légèrement sur mon clavier toujours dans un terminal :

make sqlite3

  • on attend encore que le café ou le thé ou le chocolat ou la tisane refroidisse.

Lorsque c'est terminé, on liste le répertoire et on doit trouver un beau sqlite3 tout neuf, tout gros, tout dodu, bien formé et en pleine santé.
Chez moi, le binaire dépasse les 5 Mo comparés au 53 Ko, ça laisse rêveur.
Mais, ça en vaut le coup.

Dans un terminal, saisissez :
# sqlite3 --help
Usage: sqlite3 [OPTIONS] [FILENAME [SQL...]]
FILENAME is the name of an SQLite database. A new database is created
if the file does not previously exist. Defaults to :memory:.
OPTIONS include:
  --                  treat no subsequent arguments as options
  -A ARGS...          run ".archive ARGS" and exit
  -append              append the database to the end of the file
  -ascii              set output mode to 'ascii'
  -bail                stop after hitting an error
  -batch              force batch I/O
  -box                set output mode to 'box'
  -cmd COMMAND        run "COMMAND" before reading stdin
  -column              set output mode to 'column'
  -csv                set output mode to 'csv'
  -deserialize        open the database using sqlite3_deserialize()
  -echo                print inputs before execution
  -escape T            ctrl-char escape; T is one of: symbol, ascii, off
  -init FILENAME      read/process named file
  -[no]header          turn headers on or off
  -help                show this message
  -html                set output mode to HTML
  -ifexists            only open if database already exists
  -interactive        force interactive I/O
  -json                set output mode to 'json'
  -line                set output mode to 'line'
  -list                set output mode to 'list'
  -lookaside SIZE N    use N entries of SZ bytes for lookaside memory
  -markdown            set output mode to 'markdown'
  -maxsize N          maximum size for a --deserialize database
  -memtrace            trace all memory allocations and deallocations
  -mmap N              default mmap size set to N
  -newline SEP        set output row separator. Default: '\n'
  -nofollow            refuse to open symbolic links to database files
  -noinit              Do not read the ~/.sqliterc file at startup
  -nonce STRING        set the safe-mode escape nonce
  -no-rowid-in-view    Disable rowid-in-view using sqlite3_config()
  -nullvalue TEXT      set text string for NULL values. Default ''
  -pagecache SIZE N    use N slots of SZ bytes each for page cache memory
  -pcachetrace        trace all page cache operations
  -quote              set output mode to 'quote'
  -readonly            open the database read-only
  -safe                enable safe-mode
  -screenwidth N      use N as the default screenwidth
  -separator SEP      set output column separator. Default: '|'
  -stats              print memory stats before each finalize
  -table              set output mode to 'table'
  -tabs                set output mode to 'tabs'
  -unsafe-testing      allow unsafe commands and modes for testing
  -version            show SQLite version
  -vfs NAME            use NAME as the default VFS
  -vfstrace            enable tracing of all VFS calls
  -zip                open the file as a ZIP Archive

C'est saisissant.

Voyons ce que contient l'aide dans un session SQLite3.
Pour ça, on tape :
# sqlite3
SQLite version 3.53.2 2026-06-03 19:12:13
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .help
.archive ...            Manage SQL archives
.auth ON|OFF            Show authorizer callbacks
.backup ?DB? FILE        Backup DB (default "main") to FILE
.bail on|off            Stop after hitting an error.  Default OFF
.cd DIRECTORY            Change the working directory to DIRECTORY
.changes on|off          Show number of rows changed by SQL
.check OPTIONS ...      Verify the results of a .testcase
.clone NEWDB            Clone data into NEWDB from the existing database
.connection [close] [#]  Open or close an auxiliary database connection
.crlf ?on|off?          Whether or not to use \r\n line endings
.databases              List names and files of attached databases
.dbconfig ?op? ?val?    List or change sqlite3_db_config() options
.dbinfo ?DB?            Show status information about the database
.dbtotxt                Hex dump of the database file
.dump ?OBJECTS?          Render database content as SQL
.echo on|off            Turn command echo on or off
.eqp on|off|full|...    Enable or disable automatic EXPLAIN QUERY PLAN
.excel                  Display the output of next command in spreadsheet
.exit ?CODE?            Exit this program with return-code CODE
.expert                  EXPERIMENTAL. Suggest indexes for queries
.explain ?on|off|auto?  Change the EXPLAIN formatting mode.  Default: auto
.filectrl CMD ...        Run various sqlite3_file_control() operations
.fullschema ?--indent?  Show schema and the content of sqlite_stat tables
.headers on|off          Turn display of headers on or off
.help ?-all? ?PATTERN?  Show help text for PATTERN
.import FILE TABLE      Import data from FILE into TABLE
.imposter INDEX TABLE    Create imposter table TABLE on index INDEX
.indexes ?PATTERN?      Show names of indexes matching PATTERN
.intck ?STEPS_PER_UNLOCK?  Run an incremental integrity check on the db
.limit ?LIMIT? ?VAL?    Display or change the value of an SQLITE_LIMIT
.lint OPTIONS            Report potential schema issues.
.load FILE ?ENTRY?      Load an extension library
.log FILE|on|off        Turn logging on or off.  FILE can be stderr/stdout
.mode ?MODE? ?OPTIONS?  Set output mode
.nonce STRING            Suspend safe mode for one command if nonce matches
.nullvalue STRING        Use STRING in place of NULL values
.once ?OPTIONS? ?FILE?  Output for the next SQL command only to FILE
.open ?OPTIONS? ?FILE?  Close existing database and reopen FILE
.output ?FILE?          Send output to FILE or stdout if FILE is omitted
.parameter CMD ...      Manage SQL parameter bindings
.print STRING...        Print literal STRING
.progress N              Invoke progress handler after every N opcodes
.prompt MAIN CONTINUE    Replace the standard prompts
.quit                    Stop interpreting input stream, exit if primary.
.read FILE              Read input from FILE or command output
.recover                Recover as much data as possible from corrupt db.
.restore ?DB? FILE      Restore content of DB (default "main") from FILE
.save ?OPTIONS? FILE    Write database to FILE (an alias for .backup ...)
.scanstats on|off|est    Turn sqlite3_stmt_scanstatus() metrics on or off
.schema ?PATTERN?        Show the CREATE statements matching PATTERN
.sha3sum ...            Compute a SHA3 hash of database content
.shell CMD ARGS...      Run CMD ARGS... in a system shell
.stats ?ARG?            Show stats or turn stats on or off
.system CMD ARGS...      Run CMD ARGS... in a system shell
.tables ?TABLE?          List names of tables matching LIKE pattern TABLE
.testcase NAME          Begin a test case.
.timeout MS              Try opening locked tables for MS milliseconds
.timer on|off|once      Turn SQL timer on or off.
.trace ?OPTIONS?        Output each SQL statement as it is run
.version                Show source, library and compiler versions
.vfsinfo ?AUX?          Information about the top-level VFS
.vfslist                List all available VFSes
.vfsname ?AUX?          Print the name of the VFS stack
.www                    Display output of the next command in web browser
sqlite>

Il ne vous reste plus qu'à bien vous amuser !

J'allais oublier : en pièce jointe la compilation pour Toutou SlaXen (32 bits).
Essayez-le si vous avez une distro 32 bits, peut-être cela fonctionnera-t-il. Peut-être aurez-vous besoin de créer quelques liens symboliques pour les librairies.

À la prochaine les p'tits loups.

[EDIT DU MÊME JOUR]
Ajout d'un .pet créé à partir d'un paquet de SliTaz. Dans leur recette, je vois que readline est désactivé, sauf erreur de ma part.
Ci-joint le .pet qui à l'installation pèse un peu plus d'1 Mo.
Il s'agit de la version 3.39.2.
Qu'on se le dise !
Vive Toutou Linux
"Tout le monde a le droit de vivre en paix !" dit une dame africaine.

Re : SQLite3

Répondre #2
Rien à voir. Mais un peu tout de même.
Dans la dernière version de EasyOS 7.4, Barry Kauler a ajouté l'application Symphytum pour gérer à la souris les bases de données SQLite.
Cela semble mignon et pas trop lourd. Non testé. (Comme j'oublie tout, je ne peux pas enregistrer de données.)

L'asticot
Cum facis quod potes, significat te facere quod debes.

 

Re : SQLite3

Répondre #3
EasyOS est en 64 bits.
Symphytum est régulièrement cité sur le forum.puppylinux.com
Jamais testé.
Je regarderai si je trouve un paquet compatible avec ma distribution fétiche.

Par contre, je viens de tester les modes .excell, .www et box, c'est bluffant.
Pour les deux premiers, ça ouvre Gnumeric avec l'extraction demandée, et le navigateur par défaut avec un fichier .html.
Seul hic, les lettres accentuées ne sont pas gérées pour le fichier html, mais le sont avec le tableur.

Les fichiers .zip semblent supportés. Testé avec sqlite-src-3530200.zip : ok.

Ciao bambino.
Vive Toutou Linux
"Tout le monde a le droit de vivre en paix !" dit une dame africaine.

 
Simple Audio Video Embedder