Filtrer les données à l'aide de requêtes JSON
Dans cette étape, vous utiliserez la fonction personnalisée json_extract pour filtrer les données en fonction des valeurs contenues dans les champs JSON.
Ouvrez à nouveau le fichier json_extractor.py.
nano json_extractor.py
Modifiez le fichier json_extractor.py pour inclure une fonction permettant d'interroger la base de données :
## Importer les bibliothèques nécessaires
import sqlite3
import json
## Définir une fonction pour extraire une valeur d'une chaîne JSON à l'aide d'un chemin
def json_extract(json_str, path):
try:
## Analyser la chaîne JSON en un dictionnaire Python
json_data = json.loads(json_str)
## Diviser le chemin en composants (par exemple, 'specs.cpu' devient ['specs', 'cpu'])
path_components = path.split('.')
## Commencer avec l'objet JSON complet
value = json_data
## Parcourir l'objet JSON en utilisant les composants du chemin
for component in path_components:
## Obtenir la valeur pour le composant actuel
value = value.get(component)
## Retourner la valeur finale
return value
## Gérer les erreurs si le JSON est invalide ou si le chemin n'existe pas
except (json.JSONDecodeError, AttributeError, TypeError):
return None
## Définir une fonction pour se connecter à la base de données et enregistrer la fonction personnalisée
def connect_db(db_path):
## Se connecter à la base de données SQLite au chemin donné
conn = sqlite3.connect(db_path)
## Enregistrer la fonction Python 'json_extract' comme fonction SQL personnalisée
conn.create_function("json_extract", 2, json_extract)
## Retourner la connexion à la base de données
return conn
## Définir une fonction pour filtrer les produits en fonction d'un champ JSON
def filter_products(db_path, json_path, value):
## Se connecter à la base de données
conn = connect_db(db_path)
## Créer un objet curseur
cursor = conn.cursor()
## Créer la requête SQL à l'aide d'une f-string pour filtrer par une valeur JSON
query = f"SELECT * FROM products WHERE json_extract(details, '{json_path}') = '{value}'"
## Exécuter la requête
cursor.execute(query)
## Récupérer tous les résultats correspondants
results = cursor.fetchall()
## Fermer la connexion à la base de données
conn.close()
## Retourner les résultats
return results
## Ce bloc s'exécute lorsque le script est exécuté directement
if __name__ == '__main__':
## Exemple d'utilisation :
## Filtrer les produits dont la marque est 'Dell'
dell_products = filter_products('mydatabase.db', 'brand', 'Dell')
print("Produits avec la marque 'Dell':", dell_products)
## Filtrer les produits dont le CPU est 'Intel i7'
intel_products = filter_products('mydatabase.db', 'specs.cpu', 'Intel i7')
print("Produits avec le CPU 'Intel i7':", intel_products)
Ce code ajoute une fonction filter_products qui prend en entrée un chemin de base de données, un chemin JSON et une valeur. Il se connecte ensuite à la base de données, enregistre la fonction json_extract et exécute une requête pour trouver tous les produits où la valeur au chemin JSON spécifié correspond à la valeur donnée.
Enregistrez le fichier et quittez nano.
Exécutez maintenant le script Python.
python3 json_extractor.py
Sortie attendue :
Produits avec la marque 'Dell': [(1, 'Laptop', '{"brand": "Dell", "model": "XPS 13", "specs": {"cpu": "Intel i7", "memory": "16GB", "storage": "512GB SSD"}}')]
Produits avec le CPU 'Intel i7': [(1, 'Laptop', '{"brand": "Dell", "model": "XPS 13", "specs": {"cpu": "Intel i7", "memory": "16GB", "storage": "512GB SSD"}}')]
Cette sortie montre les produits qui correspondent aux critères spécifiés.