Фильтрация данных с использованием JSON-запросов
На этом шаге вы будете использовать пользовательскую функцию json_extract для фильтрации данных на основе значений в полях JSON.
Снова откройте файл json_extractor.py.
nano json_extractor.py
Измените файл json_extractor.py, добавив функцию для запроса к базе данных:
## Импорт необходимых библиотек
import sqlite3
import json
## Определение функции для извлечения значения из строки JSON по пути
def json_extract(json_str, path):
try:
## Парсинг строки JSON в словарь Python
json_data = json.loads(json_str)
## Разделение пути на компоненты (например, 'specs.cpu' становится ['specs', 'cpu'])
path_components = path.split('.')
## Начинаем с полного объекта JSON
value = json_data
## Обход объекта JSON с использованием компонентов пути
for component in path_components:
## Получение значения для текущего компонента
value = value.get(component)
## Возврат конечного значения
return value
## Обработка ошибок, если JSON недействителен или путь не существует
except (json.JSONDecodeError, AttributeError, TypeError):
return None
## Определение функции для подключения к базе данных и регистрации пользовательской функции
def connect_db(db_path):
## Подключение к базе данных SQLite по указанному пути
conn = sqlite3.connect(db_path)
## Регистрация функции Python 'json_extract' как пользовательской SQL-функции
conn.create_function("json_extract", 2, json_extract)
## Возврат соединения с базой данных
return conn
## Определение функции для фильтрации продуктов на основе поля JSON
def filter_products(db_path, json_path, value):
## Подключение к базе данных
conn = connect_db(db_path)
## Создание объекта курсора
cursor = conn.cursor()
## Создание SQL-запроса с использованием f-строки для фильтрации по значению JSON
query = f"SELECT * FROM products WHERE json_extract(details, '{json_path}') = '{value}'"
## Выполнение запроса
cursor.execute(query)
## Получение всех совпадающих результатов
results = cursor.fetchall()
## Закрытие соединения с базой данных
conn.close()
## Возврат результатов
return results
## Этот блок выполняется при прямом запуске скрипта
if __name__ == '__main__':
## Пример использования:
## Фильтрация продуктов, где бренд - 'Dell'
dell_products = filter_products('mydatabase.db', 'brand', 'Dell')
print("Products with brand 'Dell':", dell_products)
## Фильтрация продуктов, где процессор - 'Intel i7'
intel_products = filter_products('mydatabase.db', 'specs.cpu', 'Intel i7')
print("Products with CPU 'Intel i7':", intel_products)
Этот код добавляет функцию filter_products, которая принимает путь к базе данных, путь к JSON и значение в качестве входных данных. Затем он подключается к базе данных, регистрирует функцию json_extract и выполняет запрос для поиска всех продуктов, где значение по указанному пути JSON совпадает с заданным значением.
Сохраните файл и выйдите из nano.
Теперь запустите Python-скрипт.
python3 json_extractor.py
Ожидаемый вывод:
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"}}')]
Этот вывод показывает продукты, соответствующие указанным критериям.