Введение
Google Firestore — это облачная NoSQL база данных от Firebase, предназначенная для хранения JSON-документов. Она отлично подходит для масштабируемых, real-time приложений. Однако, работать с Firestore напрямую через google-cloud-firestore
не всегда удобно, особенно если вы привыкли к объектно-ориентированному подходу и типизированному коду.
FireO – ORM для Google Firestore — это Python-библиотека, которая упрощает работу с Firestore, предоставляя интерфейс, напоминающий ORM. Модели, поля, валидация, связи — всё это теперь доступно и в мире Firebase.
Установка и настройка FireO
Установка:
Настройка:
-
Создайте service account в Firebase Console.
-
Скачайте JSON-ключ.
-
Укажите путь к ключу в переменной окружения:
Основы Firestore и документо-ориентированной модели
Firestore хранит данные в коллекциях, каждая из которых содержит документы. Документы — это JSON-объекты с произвольными полями, могут содержать подколлекции.
Firestore — безсхемная база, но FireO добавляет уровень структуры и валидации.
Создание моделей в FireO
Сохранение данных:
CRUD-операции: создание, чтение, обновление, удаление
Создание и авто-ID
Чтение
Обновление
Удаление
Запросы и фильтрация данных
Итерация:
Сложные фильтры
Firestore не поддерживает сложные логические выражения, но FireO позволяет формировать цепочки фильтров.
Отношения и вложенные модели
ReferenceField
Вложенные структуры (EmbeddedField)
FireO также поддерживает вложенные поля через сериализуемые структуры.
Валидация и типы данных
FireO поддерживает типизацию:
-
TextField
-
NumberField
-
BooleanField
-
ListField
-
MapField
Можно задавать required
, default
, choices
, max_length
и другие ограничения:
Асинхронная работа с FireO
На момент написания FireO работает синхронно. Для асинхронных операций используйте:
-
Асинхронные обёртки через
run_in_executor
-
Варианты через
google-cloud-firestore
с asyncio (ручное управление)
Интеграция с FastAPI, Flask, Django
Пример с FastAPI:
С Flask — стандартная интеграция:
Логирование и отладка
FireO позволяет отследить ошибки валидации, запросы и ключи документов. Логируйте:
Тестирование с FireO
-
Используйте Firestore Emulator от Firebase
-
Задайте переменную окружения:
-
Для юнит-тестов используйте мок-объекты или подмену
collection
/get
Сравнение с другими библиотеками Firestore
Библиотека | ORM | Типизация | Сложные связи | Подходит для |
---|---|---|---|---|
FireO | Да | Да | Да | Простые модели |
google-cloud-firestore | Нет | Нет | Частично | Полный контроль |
Odmantic | Да | Да (Pydantic) | Да | Async-приложения |
Часто задаваемые вопросы (FAQ)
1. Что такое FireO?
Это ORM для Firestore, написанная на Python, с валидацией, связями и простым синтаксисом.
2. Работает ли FireO асинхронно?
Нет, но можно использовать в run_in_executor
.
3. Поддерживает ли FireO вложенные поля?
Да, через MapField
и ReferenceField
.
4. Как тестировать FireO?
С помощью Firebase Emulator или моков.
5. Можно ли использовать FireO в продакшене?
Да, но рекомендуется для небольших и средних проектов.
6. С чем лучше всего использовать FireO?
С FastAPI, Flask, CLI-приложениями и микросервисами на Python.
Полный справочник по ключевым функциям и модулям библиотеки FireO для Python
Установка
Также потребуется настроить аутентификацию через переменную окружения или файл:
Настройка подключения
Создание модели
Компонент | Описание |
---|---|
Model |
Базовый класс для всех моделей. |
Field |
Определение поля документа. |
Вставка данных
Метод | Описание |
---|---|
.save() |
Сохраняет новый документ в Firestore. |
Model.collection.create({...}) |
Альтернативная форма создания. |
Обновление данных
Метод | Описание |
---|---|
.update() |
Обновление существующего документа. |
Получение данных
Метод | Описание |
---|---|
Model.collection.get("doc_id") |
Получает документ по ID. |
Model.collection.filter(...) |
Поиск по условию. |
.fetch() |
Выполняет запрос. |
.first() |
Первый результат. |
Удаление документов
Метод | Описание |
---|---|
.delete() |
Удаляет документ из Firestore. |
Поддержка родительских/дочерних коллекций
Встроенные поля
Поле | Описание |
---|---|
id |
Уникальный ID документа. |
key |
Полный путь к документу. |
created_at , updated_at |
Автоматические временные метки (если включены). |
Валидация и типы полей
Тип поля | Описание |
---|---|
TextField() |
Строка |
NumberField() |
Число |
BooleanField() |
Логический тип |
DateTimeField() |
Дата и время |
ReferenceField(Model) |
Связь с другим документом |
ListField() |
Список значений |
MapField() |
Вложенный словарь |
Пагинация и сортировка
Метод | Описание |
---|---|
.order("field") |
Сортировка по полю. |
.limit(n) |
Ограничение количества. |
.offset(n) |
Смещение. |
Работа с ссылками (ReferenceField)
Расширенные возможности
Возможность | Описание |
---|---|
Автоматическая генерация ID | Если не указан вручную. |
Поддержка вложенных коллекций | Через .parent(...) . |
Автоматические временные метки | Включаются через Meta класс. |
Работа с транзакциями | Пока не реализовано напрямую в FireO. |