Бэкенды¶
go-activerecord поддерживает два бэкенда: PostgreSQL и Octopus/Tarantool 1.5.
Сравнение бэкендов¶
| Особенность | PostgreSQL | Octopus/Tarantool |
|---|---|---|
| Протокол | SQL (pgx/v5) | iproto (binary) |
| Namespace | Имя таблицы (users) |
Числовой ID (5) |
| Условные индексы | ✅ Поддерживаются | ✅ Поддерживаются |
| Хранимые процедуры | ❌ Не реализовано | ✅ ProcFields |
| Порядок полей | Не важен | Критичен! |
Автокоммит
Оба бэкенда работают в режиме автокоммита. Транзакции не поддерживаются. Подробнее: Транзакции и автокоммит.
PostgreSQL¶
Декларация¶
//ar:serverConf:pgconf
//ar:namespace:users
//ar:backend:postgres
type FieldsUser struct {
Id int64 `ar:"primary_key"`
Email string `ar:"unique;size:256"`
Name string `ar:"size:256"`
}
Особенности¶
Условные индексы:
type IndexesUser struct {
ActiveUsers bool `ar:"fields:Status,CreatedAt;condition:Status[=]1&&DeletedAt[is null]"`
}
BulkUpdate и BulkInsertReplace:
// Массовое обновление
updatedCount, err := user.BulkUpdate(ctx, users)
// Массовая вставка
err := user.BulkInsertReplace(ctx, users, user.OnConflictEmail)
Генерация DDL схемы:
Драйвер¶
Используется pgx/v5 — высокопроизводительный драйвер PostgreSQL для Go.
Octopus/Tarantool 1.5¶
Декларация¶
//ar:serverConf:octconf
//ar:namespace:5
//ar:backend:octopus
type FieldsUser struct {
Id int64 `ar:"primary_key"`
Email string `ar:"size:256;selector:SelectByEmail"`
Name string `ar:"size:256"`
}
Особенности¶
Порядок полей критичен
Порядок полей в Fields* должен точно соответствовать порядку полей в tuple. Несоответствие приведёт к повреждению данных!
Протокол iproto:
Используется бинарный протокол iproto для максимальной производительности.
Дополнительные поля (extraFields):
Если tuple содержит больше полей, чем объявлено, лишние сохраняются в extraFields.
Триггер RepairTuple:
Вызывается при проблемах с десериализацией (например, неверное число полей).
Порядок индексов¶
Порядок объявления индексов должен соответствовать конфигурации Octopus:
type IndexesUser struct {
// Индекс 0
Primary bool `ar:"fields:Id;primary_key"`
// Индекс 1
Email bool `ar:"fields:Email;unique"`
// Индекс 2
Status bool `ar:"fields:Status"`
}
Выбор бэкенда¶
graph TD
A{Требования проекта} --> B{Нужна<br/>максимальная<br/>скорость?}
B -->|Да| C[Octopus]
B -->|Нет| D{Нужны SQL<br/>возможности?}
D -->|Да| E[PostgreSQL]
D -->|Нет| F{In-memory<br/>хранение?}
F -->|Да| C
F -->|Нет| E
C --> G[In-memory<br/>Бинарный протокол<br/>Хранимые процедуры]
E --> H[SQL запросы<br/>BulkUpdate<br/>DDL генерация]
Когда PostgreSQL¶
- Сложные SQL-запросы и аналитика
- BulkUpdate/BulkInsertReplace для массовых операций
- Генерация DDL схемы
- Интеграция с существующей PostgreSQL инфраструктурой
Когда Octopus¶
- Требуется максимальная производительность (in-memory)
- Минимальная задержка операций
- Хранимые процедуры на Lua (ProcFields)
- Существующая инфраструктура на Tarantool 1.5
Миграция между бэкендами¶
Для миграции с Octopus на PostgreSQL:
- Измените
//ar:backend:postgres - Измените namespace с числа на имя таблицы
- Перегенерируйте код
- Создайте таблицу в PostgreSQL
Совет
Используйте генератор схемы для создания DDL из декларации.
Следующие шаги¶
- PostgreSQL — специфические возможности
- Octopus — работа с tuples и процедурами