FireO – ORM для Google Firestore

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

Google Firestore — это облачная NoSQL база данных от Firebase, предназначенная для хранения JSON-документов. Она отлично подходит для масштабируемых, real-time приложений. Однако, работать с Firestore напрямую через google-cloud-firestore не всегда удобно, особенно если вы привыкли к объектно-ориентированному подходу и типизированному коду.

FireO – ORM для Google Firestore — это Python-библиотека, которая упрощает работу с Firestore, предоставляя интерфейс, напоминающий ORM. Модели, поля, валидация, связи — всё это теперь доступно и в мире Firebase.

Установка и настройка FireO

Установка:

bash
pip install fireo

Настройка:

  1. Создайте service account в Firebase Console.

  2. Скачайте JSON-ключ.

  3. Укажите путь к ключу в переменной окружения:

bash
export GOOGLE_APPLICATION_CREDENTIALS="path/to/your-key.json"

Основы Firestore и документо-ориентированной модели

Firestore хранит данные в коллекциях, каждая из которых содержит документы. Документы — это JSON-объекты с произвольными полями, могут содержать подколлекции.

Firestore — безсхемная база, но FireO добавляет уровень структуры и валидации.

Создание моделей в FireO

python
from fireo.models import Model from fireo.fields import TextField, NumberField class User(Model): name = TextField() age = NumberField()

Сохранение данных:

python
user = User(name="Иван", age=30) user.save()

CRUD-операции: создание, чтение, обновление, удаление

Создание и авто-ID

python
user = User(name="Анна", age=25) user.save() print(user.key) # auto-generated document ID

Чтение

python
user = User.collection.get("user_id")

Обновление

python
user.name = "Анна Петрова" user.update()

Удаление

python
user.delete()

Запросы и фильтрация данных

python
users = User.collection.filter("age", ">", 20).order("name").fetch()

Итерация:

python
for user in users: print(user.name)

Сложные фильтры

Firestore не поддерживает сложные логические выражения, но FireO позволяет формировать цепочки фильтров.

python
users = User.collection.filter("age", ">=", 18).filter("age", "<=", 30).fetch()

Отношения и вложенные модели

ReferenceField

python
from fireo.fields import ReferenceField class Post(Model): title = TextField() author = ReferenceField(User)
python
post = Post(title="Заголовок", author=user.key) post.save()

Вложенные структуры (EmbeddedField)

FireO также поддерживает вложенные поля через сериализуемые структуры.

Валидация и типы данных

FireO поддерживает типизацию:

  • TextField

  • NumberField

  • BooleanField

  • ListField

  • MapField

Можно задавать required, default, choices, max_length и другие ограничения:

python
name = TextField(required=True, max_length=50)

Асинхронная работа с FireO

На момент написания FireO работает синхронно. Для асинхронных операций используйте:

  • Асинхронные обёртки через run_in_executor

  • Варианты через google-cloud-firestore с asyncio (ручное управление)

Интеграция с FastAPI, Flask, Django

Пример с FastAPI:

python
from fastapi import FastAPI from models import User app = FastAPI() @app.post("/users") def create_user(user: User): user.save() return user.to_dict()

С Flask — стандартная интеграция:

python
@app.route('/user') def user(): u = User.collection.get('...') return jsonify(u.to_dict())

Логирование и отладка

FireO позволяет отследить ошибки валидации, запросы и ключи документов. Логируйте:

python
print(user.to_dict()) print(user.key)

Тестирование с FireO

  • Используйте Firestore Emulator от Firebase

  • Задайте переменную окружения:

bash
export FIRESTORE_EMULATOR_HOST=localhost:8080
  • Для юнит-тестов используйте мок-объекты или подмену 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

Установка

bash
pip install fireo

Также потребуется настроить аутентификацию через переменную окружения или файл:

bash
export GOOGLE_APPLICATION_CREDENTIALS="path/to/serviceAccountKey.json"

Настройка подключения

python
from fireo import connection connection(from_file="path/to/serviceAccountKey.json")

Создание модели

Компонент Описание
Model Базовый класс для всех моделей.
Field Определение поля документа.
python
from fireo.models import Model from fireo.fields import TextField, NumberField class User(Model): name = TextField() age = NumberField()

Вставка данных

Метод Описание
.save() Сохраняет новый документ в Firestore.
Model.collection.create({...}) Альтернативная форма создания.
python
user = User(name="Ваня", age=25) user.save()

Обновление данных

Метод Описание
.update() Обновление существующего документа.
python
user.age = 26 user.update()

Получение данных

Метод Описание
Model.collection.get("doc_id") Получает документ по ID.
Model.collection.filter(...) Поиск по условию.
.fetch() Выполняет запрос.
.first() Первый результат.
python
user = User.collection.get("some_doc_id") users = User.collection.filter("age", ">", 20).fetch()

Удаление документов

Метод Описание
.delete() Удаляет документ из Firestore.
python
user.delete()

Поддержка родительских/дочерних коллекций

python
class Order(Model): user = TextField() total = NumberField() order = Order.collection.parent("users/user_id").create({"total": 99.99})

Встроенные поля

Поле Описание
id Уникальный ID документа.
key Полный путь к документу.
created_at, updated_at Автоматические временные метки (если включены).

Валидация и типы полей

Тип поля Описание
TextField() Строка
NumberField() Число
BooleanField() Логический тип
DateTimeField() Дата и время
ReferenceField(Model) Связь с другим документом
ListField() Список значений
MapField() Вложенный словарь
python
from fireo.fields import BooleanField class Task(Model): title = TextField() done = BooleanField(default=False)

Пагинация и сортировка

Метод Описание
.order("field") Сортировка по полю.
.limit(n) Ограничение количества.
.offset(n) Смещение.
python
Task.collection.order("title").limit(5).fetch()

Работа с ссылками (ReferenceField)

python
from fireo.fields import ReferenceField class Profile(Model): user = ReferenceField(User) profile = Profile(user=user) profile.save()

Расширенные возможности

Возможность Описание
Автоматическая генерация ID Если не указан вручную.
Поддержка вложенных коллекций Через .parent(...).
Автоматические временные метки Включаются через Meta класс.
Работа с транзакциями Пока не реализовано напрямую в FireO.

Meta-на<