Introduction à LiteDB et son utilisation avec PowerShell
LiteDB est une base de données NoSQL embarquée, conçue spécifiquement pour l’environnement .NET. Son intégration avec .NET la rend aisément accessible via PowerShell, où elle excelle en tant que solution de stockage de données locale, flexible et adaptable. Bénéficiant d’un cryptage natif, de requêtes s’inspirant de SQL et d’une conformité ACID garantissant l’intégrité des transactions, LiteDB se distingue par sa simplicité d’utilisation. Cet article se penchera sur les possibilités offertes par LiteDB dans PowerShell et sur ses applications potentielles.
Mise en place de LiteDB dans PowerShell
Disponible sous forme de package NuGet, l’installation de LiteDB se réalise sans difficulté par la cmdlet Install-Package
. La dernière version stable, au moment de la rédaction de cet article, est la version 5.0.9
, qui sera utilisée comme version minimale. De plus, pour éviter les complications liées aux droits administrateur, l’installation s’effectuera dans la portée CurrentUser
.
Install-Package -Name 'LiteDB' -MinimumVersion '5.0.9' -Source 'nuget.org' -Scope 'CurrentUser'
L’étape suivante consiste à importer la bibliothèque afin de pouvoir l’utiliser. Bien que l’utilisation d’Add-Type
avec le chemin de l’assembly soit envisageable, une méthode automatisée sera privilégiée.
# Vérification de la présence de l'assembly en recherchant le PSType de LiteDB.LiteDatabase
If ( -Not ([System.Management.Automation.PSTypeName]'LiteDB.LiteDatabase').Type ) {
# 1) Obtention du chemin du package LiteDB via sa source
# 2) Le résultat étant le fichier *.nupkg, utilisation de Split-Path pour récupérer uniquement le chemin racine
# 3) Divers DLL sont présents, habituellement pour .NET 4.5, .NET Standard 1.3 et .NET Standard 2.0. Sélection du .NET Standard et de la dernière version, 2.0 dans ce cas.
# Le chemin aura une forme similaire à: C:UsersusernameAppDataLocalPackageManagementNuGetPackagesLiteDB.5.0.9libnetstandard2.0LiteDB.dll
$standardAssemblyFullPath = (Get-ChildItem -Filter '*.dll' -Recurse (Split-Path (Get-Package -Name 'LiteDB').Source)).FullName | Where-Object {$_ -Like "*standard*"} | Select-Object -Last 1
Add-Type -Path $standardAssemblyFullPath -ErrorAction 'SilentlyContinue'
}
Le module étant désormais chargé, la section suivante expliquera comment créer une nouvelle base de données LiteDB.
Création d’une base de données LiteDB
LiteDB met à disposition un ensemble de commandes, dont les détails sont accessibles ici. La première étape est la création d’une nouvelle base de données, en spécifiant l’emplacement de son fichier. LiteDB générant des bases de données dans un unique fichier, le chemin choisi est flexible. Dans cet exemple, le fichier de base de données, nommé Test.db
, sera créé dans le répertoire de travail actuel.
# Création de la base de données Test.db dans le répertoire courant
$Database = [LiteDB.LiteDatabase]::New((Join-Path -Path "." -ChildPath "Test.db"))
Il est crucial de noter que le fichier
Test.db
reste verrouillé tant que la méthode$Database.Dispose()
n’a pas été invoquée.
La section suivante détaillera la création d’une table, l’ajout d’un index et l’insertion d’un nouvel enregistrement dans la base de données.
Création d’une table et ajout d’un enregistrement
LiteDB utilise le concept de collections, similaires aux tables dans SQL et aux collections dans MongoDB. Pour les besoins de cet article, une collection nommée TestCollection
sera créée. La méthode GetCollection()
assure la création de la collection si celle-ci n’existe pas encore.
# Récupération de la collection (i.e. table) pour y stocker les données
$Collection = $Database.GetCollection('TestCollection')
# Indexation du champ Name pour faciliter et accélérer les requêtes
# Un index est indispensable pour les requêtes nommées, notamment celles utilisant le champ Name
# Le résultat est envoyé à Out-Null pour éviter l'affichage de True dans la console
$Collection.EnsureIndex('Name') | Out-Null
Les index sont des outils précieux car ils améliorent les performances en évitant le scan complet et la désérialisation de la base de données à chaque requête. Ils permettent également l’utilisation de requêtes nommées lors de la recherche d’enregistrements.
Ajout d’un enregistrement dans une collection
L’ajout d’un enregistrement commence par la configuration du LiteDB.BSONMapper
. Ce mappeur est utilisé pour la manipulation des documents LiteDB, qui stockent des paires clé-valeur. Après la création du mappeur, un objet PowerShell est converti en document, qui peut ensuite être inséré dans la collection via la méthode Insert()
.
$BSONMapper = [LiteDB.BSONMapper]::New()
$Object = @{
"Name" = 'TestName'
"Value" = 'TestValue'
}
Try {
# Tentative d'insertion de l'objet en tant que nouvel enregistrement dans la collection
$Collection.Insert($BSONMapper.ToDocument($Object))
} Catch {
Throw "Impossible d'insérer l'élément."
}
Interrogation des enregistrements
LiteDB propose plusieurs méthodes pour interroger les objets, notamment :
FindAll()
– Retourne tous les documents d’une collection.FindOne()
– Retourne leFirstOrDefault
d’une requêteFind()
.FindById()
– Retourne le résultatSingleOrDefault
deFind()
en utilisant la clé primaire_id
.Find()
– Retourne tous les documents correspondant à l’expression fournie.
Dans cet exemple, nous allons explorer toutes ces méthodes en interrogeant d’abord tous les documents, puis en ciblant spécifiquement un document. L’existence d’un document peut être vérifiée avec la méthode Exists()
. Pour illustrer cela, nous vérifierons d’abord l’existence d’un document, puis nous localiserons le premier document avec le nom TestName
, et enfin nous extrairons tous les documents. Un second document, avec le même nom mais une valeur différente, est ajouté pour illustrer la dernière méthode.
# Vérification de l'existence du document avec le nom `TestName`
$Collection.Exists("`$.Name="TestName"")
# Retour du premier document avec le nom `TestName`
$Collection.FindOne("`$.Name="TestName"")
# Affichage de tous les documents dans la collection
$Collection.FindAll()
L’image ci-dessus illustre la vérification de l’existence d’un document, la localisation d’un document spécifique, puis l’affichage de tous les documents présents dans la collection.
Mise à jour et suppression d’un document
Une fois qu’un document est créé, sa valeur peut être modifiée à l’aide de la méthode Update()
.
$Item = $Collection.FindOne("`$.Name="TestName"")
$Item['Value'] = 'UpdatedValue'
Try {
# Tentative de mise à jour du document avec la nouvelle valeur
$Collection.Update($Item)
} Catch {
Throw "Impossible de mettre à jour l'élément."
}
La suppression d’un document se fait par la méthode Remove()
, nécessitant la connaissance de l’ID du document. La propriété _id
de l’objet $Item
peut être utilisée à cet effet.
Try {
# Suppression de l'élément en utilisant l'attribut _id, interne à LiteDB
$Collection.Delete($Item['_id'].RawValue)
} Catch {
Throw "Impossible de supprimer l'élément."
}
Nettoyage de la base de données et perspectives
Puisque la base de données est verrouillée lors de son utilisation, la méthode Dispose()
doit être appelée pour lever ce verrou. Cette étape est primordiale pour éviter tout risque de corruption des données.
$Database.Dispose()
Cet article a présenté un exemple complet de création, de manipulation et de suppression de documents dans une base de données LiteDB. LiteDB offre de nombreuses possibilités d’utilisation, que ce soit comme base de données de collecte temporaire sur un serveur ou comme système de stockage de documents léger, portable et facile à sauvegarder. Il est fortement recommandé d’explorer les fonctionnalités offertes par LiteDB pour découvrir tout son potentiel.