IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

SQLite 3.37 est disponible, le moteur de base de données léger apporte le mode STRICT tant attendu,
Une amélioration de l'interface CLI et plus

Le , par Bruno

47PARTAGES

7  0 
L'équipe de développement de SQLite a annoncé le 27 novembre la sortie de la version 3.37 de SQLite. Cette version apporte le mode STRICT qui est activé séparément pour chaque table d’une base de données. « Certains développeurs apprécient la liberté qu'offrent les règles de typage flexibles de SQLite et utilisent cette liberté à leur avantage. Mais d'autres développeurs sont choqués par le non-respect flagrant des règles par SQLite et préfèrent le système de typage rigide traditionnel que l'on trouve dans tous les autres moteurs de base de données SQL et dans le standard SQL. Pour ce dernier groupe, la version 3.37 de SQLite supporte un mode de typage STRICT qui est activé séparément pour chaque table », a déclaré l'équipe de développement de SQLite.

Rappelons que SQLite est un moteur de base de données relationnelle léger accessible par le langage SQL. Contrairement aux serveurs de bases de données traditionnels, comme MySQL ou PostgreSQL, sa particularité est de ne pas reproduire le schéma habituel client-serveur, mais d'être directement intégrée aux programmes. L'intégralité de la base de données (déclarations, tables, index et données) est en effet stockée dans un fichier indépendant de la plateforme. Grâce à son extrême légèreté, SQLite est l’un des moteurs de base de données les plus utilisés au monde. Il est utilisé dans de nombreux logiciels grand public, et est également très populaire sur les systèmes embarqués, notamment sur la plupart des smartphones modernes.


Table STRICT

SQLite s'efforce d'être flexible en ce qui concerne les types de données du contenu qu'il stocke. Par exemple, si une colonne de la table a pour type "INTEGER", SQLite essaie de convertir tout ce qui est inséré dans cette colonne en un nombre entier. Ainsi, une tentative d'insertion de la chaîne '123' se traduit par l'insertion d'un nombre entier 123. Mais si le contenu ne peut pas être converti sans perte en un nombre entier, par exemple si l'entrée est 'xyz', alors la chaîne originale est insérée à la place.

Certains développeurs apprécient la liberté qu'offrent les règles de typage flexibles de SQLite et utilisent cette liberté à leur avantage. Mais d'autres développeurs sont choqués par le non-respect flagrant des règles par SQLite et préfèrent le système de type rigide traditionnel que l'on trouve dans tous les autres moteurs de base de données SQL et dans le standard SQL. Pour ce dernier groupe, SQLite supporte un mode de typage strict, à partir de la version 3.37.0, mode qui est activé séparément pour chaque table.

Dans une instruction CREATE TABLE, si le mot-clef "STRICT" est ajouté à la fin, après le "" de fermeture, les règles de saisie stricte s'appliquent à cette table. Le mot-clef STRICT entraîne les différences suivantes :
  1. chaque définition de colonne doit spécifier un type de données pour cette colonne, la liberté de spécifier une colonne sans type de données est supprimée ;
  2. le type de données doit être l'un des types suivants.

  • INT
  • INTEGER
  • REAL
  • TEXT
  • BLOB
  • ANY

Le contenu inséré dans la colonne avec un type de données autre que ANY doit être soit un NULL (en supposant qu'il n'y a pas de contrainte NOT NULL sur la colonne) ou le type spécifié. SQLite tente de contraindre les données dans le type approprié en utilisant les règles d'affinité habituelles, comme le font PostgreSQL, MySQL, SQL Server et Oracle. Si la valeur ne peut pas être convertie sans perte dans le type de données spécifié, alors une erreur SQLITE_CONSTRAINT_DATATYPE est levée.

Les colonnes avec le type de données ANY peuvent accepter n'importe quel type de données (sauf qu'elles rejetteront les valeurs NULL si elles ont une contrainte NOT NULL, bien sûr). Aucune coercition de type ne se produit pour une colonne de type ANY dans une table STRICT. Les colonnes qui font partie de la CLEF PRIMAIRE sont implicitement NOT NULL. Cependant, même si la PRIMARY KEY a une contrainte NOT NULL implicite, lorsqu'une valeur NULL est insérée dans une colonne INTEGER PRIMARY KEY, la valeur NULL est automatiquement convertie en un entier unique, en utilisant les mêmes règles que pour INTEGER PRIMARY KEY sur les tables ordinaires, non strictes. Les commandes PRAGMA integrity_check et PRAGMA quick_check vérifient le type du contenu de toutes les colonnes des tables STRICT et affichent des erreurs si quelque chose ne va pas. Toutes les autres fonctions d'une table STRICT sont identiques à celles d'une table ordinaire non stricte.

Le type de données ANY

La possibilité d'héberger tout type de données dans une seule colonne s'est avérée remarquablement utile au fil des ans. Afin de continuer à soutenir cette capacité, même dans les tables STRICT, le nouveau nom de type de données ANY est introduit. Lorsque le type de données d'une colonne est "ANY", cela signifie que n'importe quel type de données - entiers, valeurs à virgule flottante, chaînes de caractères ou blobs binaires - peut être inséré dans cette table et sa valeur et son type de données seront préservés exactement comme il a été inséré. Pour autant que nous le sachions, SQLite est le seul moteur de base de données SQL qui supporte cette capacité avancée.

Le comportement de ANY est légèrement différent dans une table STRICT par rapport à une table ordinaire non stricte. Dans une table STRICT, une colonne de type ANY préserve toujours les données exactement comme elles sont reçues. Dans une table ordinaire non stricte, une colonne de type ANY tentera de convertir les chaînes qui ressemblent à des nombres en une valeur numérique et, si elle y parvient, stockera la valeur numérique plutôt que la chaîne d'origine.

Pour certains analystes, le prochain projet de l'équipe de développement de SQLite devrait être l’ajout de l’instruction CREATE DOMAIN qui permet de définir un alias de type personnalisé. Notons qu’un domaine SQL est un ensemble nommé de valeurs valides défini par l'utilisateur. Les domaines dépendent d'un certain schéma. Le domaine doit être unique au sein du schéma auquel il appartient (il ne peut pas non plus être identique à tout dans son schéma). Les domaines sont créés, modifiés et supprimés à l'aide d'instructions SQL standard. Les objets qui peuvent appartenir à un domaine sont connus sous le nom de contraintes de domaine et ils dépendent d'un certain domaine.

Pour créer un domaine, l’instruction CREATE DOMAIN est utilisée. Cette instruction crée un nouveau domaine. Un domaine est essentiellement un type de données avec des contraintes optionnelles (restrictions sur l'ensemble de valeurs autorisées). L'utilisateur qui définit un domaine devient son propriétaire. Si un nom de schéma est donné (par exemple, CREATE DOMAIN monschema.mondomaine ...), alors le domaine est créé dans le schéma spécifié. Sinon, il est créé dans le schéma courant. Le nom du domaine doit être unique parmi les types et domaines existant dans son schéma.

Les domaines permettent d'extraire des contraintes communes à plusieurs tables et de les regrouper en un seul emplacement, ce qui en facilite la maintenance. Par exemple, plusieurs tables pourraient contenir des colonnes d'adresses email, toutes nécessitant la même contrainte de vérification (CHECK) permettant de vérifier que le contenu de la colonne est bien une adresse email. Définissez un domaine plutôt que de configurer la contrainte individuellement sur chaque table.

CREATE DOMAIN spécifie le schéma englobant, nomme le domaine et identifie l'ensemble des valeurs valides du domaine. Pour modifier un domaine existant, l'instruction ALTER DOMAIN est utilisée et DROP DOMAIN est utilisée pour détruire un domaine. Sans CREATE DOMAIN, les tables STRICT ne savent pas quel type de base utiliser pour un nom de type inconnu. Ils pourraient utiliser quelque chose comme « les types inconnus sont équivalents à ANY » mais cela signifierait qu'ils ne pourraient pas implémenter CREATE DOMAIN à l'avenir sans rompre la compatibilité ascendante.

PostgreSQL serait le seul moteur de base de données relationnelle majeure à implémenter CREATE DOMAIN, bien qu'il y ait quelques SGBDR plus qui le supportent aussi (comme Firebird, Interbase, Sybase/SAP SQL). L'équipe de développement de SQLite n'a pas indiqué qu'elle prévoyait de travailler sur CREATE DOMAIN. Cependant, même si certains développeurs apprécient la liberté qu'offrent les règles de typage flexibles de SQLite et utilisent cette liberté à leur avantage, d'autres par contre sont choqués par le non-respect flagrant des règles par SQLite et préfèrent le système de type rigide traditionnel que l'on trouve dans tous les autres moteurs de base de données SQL.

« Je pense que c'est le genre de fonctionnalité susceptible de les séduire, elle devrait être relativement simple à mettre en œuvre (surtout s'ils ne mettent pas en œuvre ALTER DOMAIN, seulement CREATE et DROP), mais fournir beaucoup de puissance en échange. », déclare un développeur.

Améliorations de l'interface CLI

Le projet SQLite fournit un programme de ligne de commande simple nommé sqlite3 (ou sqlite3.exe sous Windows) qui permet à l'utilisateur de saisir et d'exécuter manuellement des instructions SQL contre une base de données SQLite ou contre une archive ZIP. Ce document fournit une brève introduction sur la façon d'utiliser le programme sqlite3. Par exemple, pour créer une nouvelle base de données SQLite nommée ex1 avec une seule table nommée tbl1, vous pouvez procéder comme suit :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
$ sqlite3 ex1
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
sqlite> create table tbl1(one varchar(10), two smallint);
sqlite> insert into tbl1 values('hello!',10);
sqlite> insert into tbl1 values('goodbye', 20);
sqlite> select * from tbl1;
hello!|10
goodbye|20
sqlite>

Voici, ci-dessous, quelques améliorations et ajouts qu’apporte la version 3.37 de SQLite à l'interface CLI :

  • amélioration des performances lors de la lecture des instructions SQL qui s'étendent sur plusieurs lignes ;
  • ajout de la commande .connection, qui permet à l'interface CLI de maintenir plusieurs connexions de base de données ouvertes en même temps ;
  • ajout de l'option de ligne de commande --safe qui désactive les commandes point et les instructions SQL susceptibles de provoquer des effets secondaires allant au-delà du fichier de base de données unique nommé sur la ligne de commande.

Source : SQLite

Et vous ?

Que pensez-vous de SQLite ? L'utilisez-vous ?

Quel est votre avis sur le mode STRICT tant attendu ?

Voir aussi :

SQLite 3.25 est disponible, le moteur de base de données léger, apporte le support des fonctions Window, un meilleur optimiseur de requêtes et plus

SQLite 3.33.0 est disponible avec la prise en charge de « UPDATE FROM » suivant la syntaxe de PostgreSQL, améliore l'extension ieee754 pour la prise en charge des numéros binary64 de l'IEEE 754

DuckDB, une base de données SQL intégrable comme SQLite, supporte les fonctionnalités de PostgreSQL, conçu pour le traitement et le stockage d'ensembles de données tabulaires

SQLite 3.35 est disponible et prend en charge pour la première fois des fonctions mathématiques et ajoute aussi le support pour la commande "ALTER TABLE DROP COLUMN"

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de marc.collin
Membre expérimenté https://www.developpez.com
Le 30/11/2021 à 1:54
Suffit de chiffrer tes données avant de les insérer
4  1 
Avatar de LeBressaud
Membre confirmé https://www.developpez.com
Le 30/11/2021 à 11:20
La version gratuite suffit à l'immense majorité des usages, libre à toi d'implémenter les quelques fonctions qu'ils te manquent. Et bon 2000$ pour une licence perpétuelle c'est dérisoire...
4  1 
Avatar de Aurelien.Regat-Barrel
Expert éminent sénior https://www.developpez.com
Le 30/11/2021 à 9:37
Citation Envoyé par Anselme45 Voir le message
Ouais mais quand tu as une base de données, cette dernière est au moins protégée par des mots-de-passe et est installée sur un serveur qui est hors d'accès de l'utilisateur final!
Le SGBD peut très bien être installé sur ton poste pour tourner en local, auquel cas l'utilisateur aura accès en lecture à ses fichiers. Y'a un certains nombres d'applis qui font cela. Et c'est exactement le use case de SQLite.

C'est pour ça que c'est très bizarre de critiquer cet aspect de cette techno dans la mesure où c'est précisément sa raison d'être, et son succès dans l'embarqué. C'est comme regretter qu'un disque dur local ne permette pas de stocker ses données sur le Cloud.

En tous cas c'est une très bonne nouvelle ce mode STRICT, c'est en effet très surprenant de découvrir comment le typage sous SQLite est une notion assez flexible dirons-nous.
3  1 
Avatar de AoCannaille
Membre expert https://www.developpez.com
Le 01/12/2021 à 15:23
Citation Envoyé par Anselme45 Voir le message
Qu'est-ce que cela veut dire "tourner en local"? Est-ce que tu connais encore des appareils qui fonctionnent sans un accès externe (internet, bluetooth et autre)?
De mémoire Firefox utilise SQLite pour stocker les préférences utilisateurs. ça me casserait vraiment les noix que mon navigateur ai besoin de se connecter à un serveur quelconque pour savoir que mon 4e bookmark est dvp... Ne serait-ce qu'en terme de performance, mais également en terme de résilience en cas de coupure réseau...
3  1 
Avatar de Anselme45
Membre extrêmement actif https://www.developpez.com
Le 29/11/2021 à 20:24
Citation Envoyé par Bruno;11788289[SUB
][B]...SQLite est l’un des moteurs de base de données les plus utilisé au monde. Il est utilisé dans de nombreux logiciels grand public, et est également très populaire sur les systèmes embarqués, notamment sur la plupart des smartphones modernes.

Oui SQLite est très utile pour des app embarquées...

Mais oui, il y a un gros problème pour un système embarqué: Les données ne sont pas protégées et sont lisibles en clair dans les fichiers où sont archivées les données!

Tu veux sécuriser tes données? Ben tu passes à la caisse auprès de sociétés qui ont bricolé SQLite pour fournir contre argent sonnant et trébuchant une version qui permet de crypter les données...

Mais les données ne sont cryptées dans une base de données me direz-vous... Ouais mais quand tu as une base de données, cette dernière est au moins protégée par des mots-de-passe et est installée sur un serveur qui est hors d'accès de l'utilisateur final!

Dans le cas de SQLite, tu ouvres un fichier texte et tu accèdes en clair à toutes les données...
3  2 
Avatar de grunk
Modérateur https://www.developpez.com
Le 30/11/2021 à 9:13
Citation Envoyé par Anselme45 Voir le message

Tu veux sécuriser tes données? Ben tu passes à la caisse auprès de sociétés qui ont bricolé SQLite pour fournir contre argent sonnant et trébuchant une version qui permet de crypter les données...
Sqlite propose une extension permettant de chiffrer les données oui c'est payant , mais c'est complètement transparent et bien plus simple à utiliser que les solutions proposées par certains gros SGBD. Et pour le coup c'est pas très cher , un truc comme 2000$ pour une licence perpétuelle de mémoire.
Quand on développe un applicatif qui à des besoins de sécurité nécessitant ce genre d'outil le coût est très souvent négligeable et comme la licence est perpetuelle elle se rentabilise sur le temps. Chez nous ca fait 10 ans qu'on l'utilise dans tous nos projets et c'est toujours compatible de version en version.
2  1 
Avatar de Aurelien.Regat-Barrel
Expert éminent sénior https://www.developpez.com
Le 30/11/2021 à 16:36
Citation Envoyé par Anselme45 Voir le message
Qu'est-ce que cela veut dire "tourner en local"? Est-ce que tu connais encore des appareils qui fonctionnent sans un accès externe (internet, bluetooth et autre)?

Ce n'est pas parce qu'un utilisateur utilise une app sur son appareil qu'il ne peut pas subir une visite peu amicale! As-tu déjà entendu parler des cyber-attaques?

En l'état, tout le monde ne développe pas des applications qui comptabilisent des carottes. Quand ton app traite des données délicates, il ne faut pas qu'elles soient lisibles en clair dans un simple fichier texte!
Eh beh, tu es bien excité toi. Tu viens ici pour t'informer ou te défouler ?

Toujours est-il qu'une bdd hébergée sur un réseau n'est pas du tout protégée contre les cyber attaques, c'est même une cause majeure de fuites massives de données depuis... longtemps. Il suffit de regarder l'évolution du top 10 de l'OWASP pour constater que le Cloud a agravé le problème. A l'inverse une partition sur un système embarqué (type ESP32 ou vrai PC) peut être encryptée de façon simple et robuste. Le fichier SQLite ne sera donc pas lisible en clair pour reprendre ton expression.

Quant au fait d'être connecté en permanence à une BDD via le net, il suffit de regarder l'histoire de la création de SQLite pour comprendre comment ce n'est pas envisageable pour beaucoup de systèmes qui ont pourtant accès au réseau. Et les gadgets IoT modernes sont certes connectés à un réseau mais via des protocoles très light (MQTT...) qui permettent de remonter des métriques mais pas de faire des query lourdes à un SGBD.
2  1 
Avatar de grunk
Modérateur https://www.developpez.com
Le 30/11/2021 à 17:26
Citation Envoyé par Anselme45 Voir le message
Ou comment faire croire que SQLite est une solution gratuite, tout en faisant passer à la caisse le développeur!

C'est justement tout le problème de l'approche: D'un côté SQLite se présente comme la solution idéale, légère, gratuite, sympa et quand tu veux faire un vrai projet: 2 000$!

Il serait plus "fair play" de dire, comme c'est le cas pour de nombreuses solutions, tu as une version limitée gratos et la vraie version est payante.
Ou alors, tu regardes les fonctionnalité de l'outil avant de commencer ton projet et si il ne convient pas et que tu n'es pas prêt à payer pour avoir la fonctionnalité manquante tu cherches un autre outil ou tu le développe toi même (l'avantage de l'open source).
Mais encore une fois , si on parle de "vrai projet" , investir 2000$ qui sera de toute manière refacturer tout ou partie au client c'est peanuts
2  1 
Avatar de SergioMaster
Rédacteur/Modérateur https://www.developpez.com
Le 30/11/2021 à 7:33
Je suis pour le STRICT même si, AMHA, une déclaration à la colonne eut été mieux qu'à la table.

PostgreSQL serait le seul moteur de base de données relationnelles majeure à implémenter CREATE DOMAIN, bien qu'il y ait quelques SGBDR plus qui le supportent aussi
Cette histoire de DOMAIN je l'utilise beaucoup dans les bases Firebird et ce depuis longtemps je ne comprends pas cette phrase. Serait-ce un atout majour dans SQLite peut-être, si le STRICT pouvait s'appliquer

Citation Envoyé par Anselme45 Voir le message

Mais oui, il y a un gros problème pour un système embarqué: Les données ne sont pas protégées et sont lisibles en clair dans les fichiers où sont archivées les données!
tu passes à la caisse auprès de sociétés qui ont bricolé SQLite pour fournir contre argent sonnant et trébuchant une version qui permet de crypter les données...
Je suis assez d'accord avec ces phrases et, si j'ai bien compris
Citation Envoyé par https://blogs.embarcadero.com/new-firedac-driver-for-sqlite-see/
La version de liaison statique du pilote FireDAC SQLite offre une prise en charge du chiffrement de la base de données, en utilisant un mécanisme de hook de base de données (SQLITE_HAS_CODEC) qui a maintenant été supprimé

AMHA on a même là un abus commercial !

Citation Envoyé par Anselme45 Voir le message
Mais les données ne sont cryptées dans une base de données me direz-vous.
Là, non. Certains SGBD pouvant être embarqués (en sus du couple user/mdp) fournissent des mécanismes de chiffrement par colonne (i.e* IBToGo mais pas IBLite) ou base entière (i.e* Firebird)
* je ne donne en exemple que celle que je maitrise, je suis sûr que MS SQLServer le propose quoique, en version Lite, j'ai un doute

Citation Envoyé par marc.collin
suffit de chiffrer tes données avant de les insérer
Tout à fait exact, même si chiffrer avant d'insérer implique déchiffrer à la lecture
1  1 
Avatar de Anselme45
Membre extrêmement actif https://www.developpez.com
Le 30/11/2021 à 11:04
Citation Envoyé par Aurelien.Regat-Barrel Voir le message
Le SGBD peut très bien être installé sur ton poste pour tourner en local, auquel cas l'utilisateur aura accès en lecture à ses fichiers. Y'a un certains nombres d'applis qui font cela. Et c'est exactement le use case de SQLite.
Qu'est-ce que cela veut dire "tourner en local"? Est-ce que tu connais encore des appareils qui fonctionnent sans un accès externe (internet, bluetooth et autre)?

Ce n'est pas parce qu'un utilisateur utilise une app sur son appareil qu'il ne peut pas subir une visite peu amicale! As-tu déjà entendu parler des cyber-attaques?

En l'état, tout le monde ne développe pas des applications qui comptabilisent des carottes. Quand ton app traite des données délicates, il ne faut pas qu'elles soient lisibles en clair dans un simple fichier texte!
1  1