Question [Tutoriel] Utilisation d'une BDD NoSQL Locale

Plus d'informations
il y a 4 ans 10 mois #28979 par Bastien
Bonjour à tous !

Petit tutoriel pour intégrer une base de données NoSQL locale à vos scripts.

/!\ Étant débutant sur Powershell et sur ce forum, il ce peut que ce tutoriel comporte des erreurs techniques et/ou de syntaxe/orthographe (je ne suis pas un expert linguistique). Merci de me prévenir pour toute coquille présente ! /!\


/!\² J'ai feuilleté rapidement le contenu des différents forums sur ce site et n'ayant pas vu de tutoriels/cours sur cette techno, je me suis lancé dans l'écriture de ce post. Désolé si celui-ci fait doublon avec un post précédent que je n'aurais pas vu. /!\

Sur ce, on commence !

Présentation de la base de données : la base de données utilisée dans ce tutoriel est LiteDB, une base de données locale (même principe que SQLite) écrite en C#. Cette base de données est compatible avec le framework .Net. C'est une base de données NoSQL (non compatible avec les requêtes SQL). Ce tuto n'a pas pour but de comparer les performances ni les différences entre les BDD SQL et NoSQL. Si vous souhaitez en savoir plus sur les différences, je vous renvoi vers l'article de sourceamax :
Lien vers l'article

Afin de l'utiliser dans notre script Powershell, nous installerons le module PSLiteDB.
Pour ce faire, 2 façons de procéder :
[code:1] Install-Module -Name PSLiteDB[/code:1]
Qui installera la dernière version de PSLiteDB depuis la Powershell Gallery ou
[code:1]Import-Module C:\répertoire\du\dossierPSLiteDB[/code:1]
si vous avez récupéré PSLiteDB depuis Github.

Une fois le module installé, nous allons créer notre première base de données à partir de Powershell.
[code:1]$dbPath = \"C:\répertoire\projet\database.db\"
New-LiteDBDatabase -Path $dbpath -verbose[/code:1]

Détaillons un peu : nous intégrons le chemin d'accès à la BDD dans une variable afin que celle ci puisse être facilement utilisable dans tout le script. Nous créons ensuite la base de données avec la commande New-LiteDatabase de paramètre notre variable contenant le chemin d'accès précédemment déclarée. Le paramètre verbose permet d'avoir une vue sur les opérations effectuées lors de la création de la BDD.

Pour pouvoir écrire dans la BDD, il nous faut d'abord l'ouvrir.
Pour ce faire,
[code:1]Open-LiteDB Connection -Database $dbpath[/code:1]
Si la BDD est verrouillé par un mot de passe (défini lors de la création, il faudra utiliser également l'option -credential.

Avant de continuer, je vais revenir sur quelques concepts de LiteDB. (eh oui, un peu de théorie chiante pour casser le rythme, sinon ça n'aurait pas été drôle!)

Les données enregistrées dans une base de données LiteDB sont stockées dans des Collections et sont enregistrées en tant que Documents. Ces Documents ont plusieurs Indexes, ils comportent un identifiant unique et plusieurs types de données en fonction de vos besoins (chiffres, chaines de caractères, booléens, fichiers (images, vidéos...)). L'identifiant est géré par défaut par la BDD lors de l'import mais il peut-être forcé. Mais on va y revenir plus tard. Gardez cependant en tête que celui-ci doit rester unique, sous peine d'avoir des erreurs lors de l'import !

Fin de la parenthèse théorie, on reprend un peu de pratique. (Enfin !)


Nous allons créer notre première Collection.
[code:1]New-LiteDBCollection -Collection nomdelacollection[/code:1]

Pour récupérer le nom des collections présentent dans la BDD :
[code:1]Get-LiteDBCollectionName[/code:1]

Nous voilà enfin à la partie sur l'insertion des données. Cette partie est une partie complexe, car les données doivent être formatées afin de pouvoir être insérées dans la BDD LiteDB.

Retournons dans la partie théorie (oui, encore, et en plus, ça va être chiant mais courage ! ;) )

Dans LiteDB, les Documents comportent des Indexes.
Lors de la récupération des données que nous souhaitons stockées, il nous faut les formatées afin de récupérer les données qui nous intéressent et de les mettre en \"ordre\" pour le stockage dans la BDD.
2 cas d'usages apparaissent alors :
- Si vous récupérez les données d'une fonction de Powershell, les données sont déjà formatées, il ne vous reste plus qu'à les sélectionnées et les convertir au format BSON (format de données de LiteDB ) pour les ajouter.
- Si vous récupérez des données brutes non formatées (exemple : extraction d'un csv), il vous faut déclarer les données à utiliser, avant de les formater et de les enregistrer.

\"Qu'est-qu'il me raconte le gus là ? C'est quoi tout ce charabia ? \"

Pas de panique ! Après la théorie indigeste, on va voir tout ça sur la forme d'exemples, pour qu'on comprenne de quoi il retourne.

Petit exercice pratique : nous allons stocker dans notre base de données locale database.db la liste des services de notre pc, ainsi que leurs propriétés (statuts, nom et nom affiché). Nous commencerons de la création de la BDD à l'insertion des données dans celle-ci. (et ça permettra aux 2 du fond qui n'ont pas suivi de reprendre pour ne pas être largués ! :laugh: )

[code:1]
Install-Module -PSLiteDB -Scope CurrentUser
$dbpath = \"C:\pwsh\database.db\"
New-LiteDatabase -Path $dbpath -Verbose
Open-LiteDatabase -Database $dbpath
New-LiteDBCollection -Collection SvcCollection

Get-Service | select @{Name=\"_id\";E={$_.Name}},DisplayName,Status | ConvertTo-LiteDbBson| Add-LiteDBDocument -Collection SvcCollection

[/code:1]
Comme tout à l'heure, je vais détailler les dernières lignes. Get-Service récupère les services présent sur le pc, qu'ils soient actifs ou non. Après le pipe, select permet de choisir les attributs que l'on souhaite stocker dans la BDD.

Mais pourquoi le premier attribut est entre crochets ?

Eh bien je vais te le dire Billy ! Le premier attribut est entre crochet pour pouvoir \"forcer\" l'identifiant dans la BDD à prendre comme valeur le nom du service plutôt que la valeur que lui attribueras LiteDB par défaut. Cela permet une recherche plus intuitive par la suite. Cet identifiant doit être unique (comme dit plus haut). Si un doute survient (pas sûr que l'attribut forcésoit unique) il vaut mieux ne pas forcer et laisser LiteDB choisir l'ID.


Pour le 2e exercice, nous allons nous intéresser au cas où les données ne sont pas formatées : l'extraction de données d'un fichier .csv.
Ces fichiers regorgent généralement de données, formatées en fonctions des logiciels/utilisateurs qui les ont créés (donc non formatées pour LiteDB ).
Dans cet exemple, nous allons extraire des personnes, définies par leur nom, leur ville et leur pays et les intégrer dans notre BDD dans une collection appelée \"Person\"

Alors prêt ? C'est parti !
(pour des raisons évidentes, je vais sauter les premières lignes, de l'import du module à l'ouverture de la BDD)

[code:1]

New-LiteDBCollection -Collection Person
$csv = \"C:\pwsh\fichier.csv\"

foreach($item in $csv)
{
$personOBJ = [PSCUSTOMObject]@{
nom = $item.nom
prenom = $item.prenom
ville = $item.ville
pays = $item.pays
}

$personBSON = $personOBJ | ConvertTo-LiteDbBSON
Add-LiteDBDocument -Collection Person -Document $personBSON
}
[/code:1]

Là encore, nous allons décortiquer le code.
La boucle foreach permet de récupérer chaque ligne du fichier .csv en l'intégrant dans la variable $item .
Pour chaque variable $item, nous allons définir un objet personnalisé contenant le nom, prénom, ville et pays de la personne afin de formater les données. Puis nous convertirons cet objet en objet BSON (compréhensible par LiteDB) et enfin nous l'intégrons dans la BDD.
Petite aparté : ici je n'ai pas forcé l'ID pour qu'il prenne une valeur que je lui ai rentré en paramètre. Effectivement, si je lui avait entré le nom d'une personne ou la ville par exemple, nous aurions eu des doublons, et des erreurs lors de l'intégration des données.

Maintenant que nous avons rempli la BDD, nous devons chercher un document stocké dedans. Pour ce faire, il existe la commande :

[code:1]Find-LiteDBDocument -Collection macollection [/code:1]

Nous pouvons aussi supprimer certaines données enregistrées. Pour ce faire, nous aurons besoin de la commande :

[code:1]Remove-LiteDBDocument -Collection macollection -ID monid[/code:1]

Puis pour finir, il ne faut surtout pas oublié de fermer la connexion à la BDD !

[code:1] Close-LiteDBConnection [/code:1]


Voilà, j'espère que ce tuto vous sera utile !
Il s'agit principalement d'une traduction du wiki du module PSLiteDB, disponible sur la page Github, ici , ainsi que la documentation officielle du projet LiteDB, disponible sur leur Github ici .

Ce tutoriel a été rédigé dans l'optique de rendre l'accès à la BDD LiteDB disponible aux débutants sous PowerShell.

En attendant vos retours !
(je vais me coucher)

Message édité par: NonneTrapuE, à: 5/06/19 23:37

Message édité par: NonneTrapuE, à: 5/06/19 23:40<br><br>Message édité par: NonneTrapuE, à: 5/06/19 23:45

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 ans 10 mois #28980 par Laurent Dardenne
Salut,
les sections code contiennent des balises parasites...

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 ans 10 mois #28991 par Bastien
Salut,

Je ne comprend, toutes les balises sont correctement placées à première vue. J'ai essayé de modifier mais rien ni fait, les balises parasites sont toujours présentes, je vais les supprimer en attendant de trouver la cause.
Merci pour ton retour

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 ans 10 mois #28996 par Laurent Dardenne
C'est mieux ainsi.
Je testerais ça prochainement.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 ans 10 mois #28998 par Bastien
C’est peut être du à la multiplication des balises (balises codes et balises couleurs)
Je réessayerais pour voir si le problème est dû à ça

J’attends ton retour pour modifier si besoin !

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.085 secondes
Propulsé par Kunena