Filtrar datos usando consultas JSON
En este paso, utilizará la función personalizada json_extract para filtrar datos basándose en valores dentro de los campos JSON.
Abra de nuevo el archivo json_extractor.py.
nano json_extractor.py
Modifique el archivo json_extractor.py para incluir una función para consultar la base de datos:
## Importar las bibliotecas necesarias
import sqlite3
import json
## Definir una función para extraer un valor de una cadena JSON usando una ruta
def json_extract(json_str, path):
try:
## Analizar la cadena JSON en un diccionario de Python
json_data = json.loads(json_str)
## Dividir la ruta en componentes (por ejemplo, 'specs.cpu' se convierte en ['specs', 'cpu'])
path_components = path.split('.')
## Empezar con el objeto JSON completo
value = json_data
## Recorrer el objeto JSON usando los componentes de la ruta
for component in path_components:
## Obtener el valor para el componente actual
value = value.get(component)
## Devolver el valor final
return value
## Manejar errores si el JSON no es válido o la ruta no existe
except (json.JSONDecodeError, AttributeError, TypeError):
return None
## Definir una función para conectarse a la base de datos y registrar la función personalizada
def connect_db(db_path):
## Conectarse a la base de datos SQLite en la ruta dada
conn = sqlite3.connect(db_path)
## Registrar la función de Python 'json_extract' como una función SQL personalizada
conn.create_function("json_extract", 2, json_extract)
## Devolver la conexión a la base de datos
return conn
## Definir una función para filtrar productos basándose en un campo JSON
def filter_products(db_path, json_path, value):
## Conectarse a la base de datos
conn = connect_db(db_path)
## Crear un objeto cursor
cursor = conn.cursor()
## Crear la consulta SQL usando una f-string para filtrar por un valor JSON
query = f"SELECT * FROM products WHERE json_extract(details, '{json_path}') = '{value}'"
## Ejecutar la consulta
cursor.execute(query)
## Obtener todos los resultados coincidentes
results = cursor.fetchall()
## Cerrar la conexión a la base de datos
conn.close()
## Devolver los resultados
return results
## Este bloque se ejecuta cuando el script se ejecuta directamente
if __name__ == '__main__':
## Ejemplo de uso:
## Filtrar productos donde la marca es 'Dell'
dell_products = filter_products('mydatabase.db', 'brand', 'Dell')
print("Products with brand 'Dell':", dell_products)
## Filtrar productos donde la CPU es 'Intel i7'
intel_products = filter_products('mydatabase.db', 'specs.cpu', 'Intel i7')
print("Products with CPU 'Intel i7':", intel_products)
Este código añade una función filter_products que toma como entrada una ruta de base de datos, una ruta JSON y un valor. Luego se conecta a la base de datos, registra la función json_extract y ejecuta una consulta para encontrar todos los productos donde el valor en la ruta JSON especificada coincide con el valor dado.
Guarde el archivo y salga de nano.
Ahora, ejecute el script de Python.
python3 json_extractor.py
Salida Esperada:
Products with brand 'Dell': [(1, 'Laptop', '{"brand": "Dell", "model": "XPS 13", "specs": {"cpu": "Intel i7", "memory": "16GB", "storage": "512GB SSD"}}')]
Products with CPU 'Intel i7': [(1, 'Laptop', '{"brand": "Dell", "model": "XPS 13", "specs": {"cpu": "Intel i7", "memory": "16GB", "storage": "512GB SSD"}}')]
Esta salida muestra los productos que coinciden con los criterios especificados.