Filtrar Dados Usando Consultas JSON
Nesta etapa, você usará a função personalizada json_extract para filtrar dados com base em valores dentro dos campos JSON.
Abra o arquivo json_extractor.py novamente.
nano json_extractor.py
Modifique o arquivo json_extractor.py para incluir uma função para consultar o banco de dados:
## Importar as bibliotecas necessárias
import sqlite3
import json
## Definir uma função para extrair um valor de uma string JSON usando um caminho
def json_extract(json_str, path):
try:
## Analisar a string JSON em um dicionário Python
json_data = json.loads(json_str)
## Dividir o caminho em componentes (por exemplo, 'specs.cpu' torna-se ['specs', 'cpu'])
path_components = path.split('.')
## Começar com o objeto JSON completo
value = json_data
## Percorrer o objeto JSON usando os componentes do caminho
for component in path_components:
## Obter o valor para o componente atual
value = value.get(component)
## Retornar o valor final
return value
## Lidar com erros se o JSON for inválido ou o caminho não existir
except (json.JSONDecodeError, AttributeError, TypeError):
return None
## Definir uma função para conectar ao banco de dados e registrar a função personalizada
def connect_db(db_path):
## Conectar ao banco de dados SQLite no caminho fornecido
conn = sqlite3.connect(db_path)
## Registrar a função Python 'json_extract' como uma função SQL personalizada
conn.create_function("json_extract", 2, json_extract)
## Retornar a conexão com o banco de dados
return conn
## Definir uma função para filtrar produtos com base em um campo JSON
def filter_products(db_path, json_path, value):
## Conectar ao banco de dados
conn = connect_db(db_path)
## Criar um objeto cursor
cursor = conn.cursor()
## Criar a consulta SQL usando uma f-string para filtrar por um valor JSON
query = f"SELECT * FROM products WHERE json_extract(details, '{json_path}') = '{value}'"
## Executar a consulta
cursor.execute(query)
## Buscar todos os resultados correspondentes
results = cursor.fetchall()
## Fechar a conexão com o banco de dados
conn.close()
## Retornar os resultados
return results
## Este bloco é executado quando o script é executado diretamente
if __name__ == '__main__':
## Exemplo de uso:
## Filtrar produtos onde a marca é 'Dell'
dell_products = filter_products('mydatabase.db', 'brand', 'Dell')
print("Produtos com a marca 'Dell':", dell_products)
## Filtrar produtos onde a CPU é 'Intel i7'
intel_products = filter_products('mydatabase.db', 'specs.cpu', 'Intel i7')
print("Produtos com CPU 'Intel i7':", intel_products)
Este código adiciona uma função filter_products que recebe um caminho de banco de dados, um caminho JSON e um valor como entrada. Em seguida, ele se conecta ao banco de dados, registra a função json_extract e executa uma consulta para encontrar todos os produtos onde o valor no caminho JSON especificado corresponde ao valor fornecido.
Salve o arquivo e saia do nano.
Agora, execute o script Python.
python3 json_extractor.py
Saída Esperada:
Produtos com a marca 'Dell': [(1, 'Laptop', '{"brand": "Dell", "model": "XPS 13", "specs": {"cpu": "Intel i7", "memory": "16GB", "storage": "512GB SSD"}}')]
Produtos com CPU 'Intel i7': [(1, 'Laptop', '{"brand": "Dell", "model": "XPS 13", "specs": {"cpu": "Intel i7", "memory": "16GB", "storage": "512GB SSD"}}')]
Esta saída mostra os produtos que correspondem aos critérios especificados.