Daten mit JSON-Abfragen filtern
In diesem Schritt verwenden Sie die benutzerdefinierte Funktion json_extract, um Daten basierend auf Werten in JSON-Feldern zu filtern.
Öffnen Sie erneut die Datei json_extractor.py.
nano json_extractor.py
Ändern Sie die Datei json_extractor.py, um eine Funktion zum Abfragen der Datenbank hinzuzufügen:
## Importieren der notwendigen Bibliotheken
import sqlite3
import json
## Definieren einer Funktion zum Extrahieren eines Wertes aus einem JSON-String mithilfe eines Pfades
def json_extract(json_str, path):
try:
## Parsen des JSON-Strings in ein Python-Dictionary
json_data = json.loads(json_str)
## Aufteilen des Pfades in Komponenten (z. B. 'specs.cpu' wird zu ['specs', 'cpu'])
path_components = path.split('.')
## Beginnen mit dem vollständigen JSON-Objekt
value = json_data
## Durchlaufen des JSON-Objekts mithilfe der Pfadkomponenten
for component in path_components:
## Abrufen des Wertes für die aktuelle Komponente
value = value.get(component)
## Zurückgeben des endgültigen Wertes
return value
## Behandeln von Fehlern, wenn JSON ungültig ist oder der Pfad nicht existiert
except (json.JSONDecodeError, AttributeError, TypeError):
return None
## Definieren einer Funktion zum Verbinden mit der Datenbank und Registrieren der benutzerdefinierten Funktion
def connect_db(db_path):
## Verbinden mit der SQLite-Datenbank am angegebenen Pfad
conn = sqlite3.connect(db_path)
## Registrieren der Python-Funktion 'json_extract' als benutzerdefinierte SQL-Funktion
conn.create_function("json_extract", 2, json_extract)
## Zurückgeben der Datenbankverbindung
return conn
## Definieren einer Funktion zum Filtern von Produkten basierend auf einem JSON-Feld
def filter_products(db_path, json_path, value):
## Verbinden mit der Datenbank
conn = connect_db(db_path)
## Erstellen eines Cursor-Objekts
cursor = conn.cursor()
## Erstellen der SQL-Abfrage mithilfe eines f-Strings zum Filtern nach einem JSON-Wert
query = f"SELECT * FROM products WHERE json_extract(details, '{json_path}') = '{value}'"
## Ausführen der Abfrage
cursor.execute(query)
## Abrufen aller übereinstimmenden Ergebnisse
results = cursor.fetchall()
## Schließen der Datenbankverbindung
conn.close()
## Zurückgeben der Ergebnisse
return results
## Dieser Block wird ausgeführt, wenn das Skript direkt ausgeführt wird
if __name__ == '__main__':
## Beispielverwendung:
## Filtern nach Produkten, bei denen die Marke 'Dell' ist
dell_products = filter_products('mydatabase.db', 'brand', 'Dell')
print("Produkte mit Marke 'Dell':", dell_products)
## Filtern nach Produkten, bei denen die CPU 'Intel i7' ist
intel_products = filter_products('mydatabase.db', 'specs.cpu', 'Intel i7')
print("Produkte mit CPU 'Intel i7':", intel_products)
Dieser Code fügt eine Funktion filter_products hinzu, die einen Datenbankpfad, einen JSON-Pfad und einen Wert als Eingabe nimmt. Anschließend verbindet er sich mit der Datenbank, registriert die Funktion json_extract und führt eine Abfrage aus, um alle Produkte zu finden, bei denen der Wert am angegebenen JSON-Pfad mit dem gegebenen Wert übereinstimmt.
Speichern Sie die Datei und beenden Sie nano.
Führen Sie nun das Python-Skript aus.
python3 json_extractor.py
Erwartete Ausgabe:
Produkte mit Marke 'Dell': [(1, 'Laptop', '{"brand": "Dell", "model": "XPS 13", "specs": {"cpu": "Intel i7", "memory": "16GB", "storage": "512GB SSD"}}')]
Produkte mit CPU 'Intel i7': [(1, 'Laptop', '{"brand": "Dell", "model": "XPS 13", "specs": {"cpu": "Intel i7", "memory": "16GB", "storage": "512GB SSD"}}')]
Diese Ausgabe zeigt die Produkte, die den angegebenen Kriterien entsprechen.