Nested Set (MPTT) management for SQLAlchemy models
Project description
sqlalchemy_nested_set
Nested Set (MPTT) implementation for SQLAlchemy 2.0+.
Автоматически управляет колонками left и right для древовидных структур. Колонка parent_id определяется пользователем в модели.
Установка
pip install sqlalchemy-nested-set
Использование
1. Определите модель с миксином
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy_nested_set import NestedSetMixin, NestedSetManager
class Base(DeclarativeBase):
pass
class Category(NestedSetMixin, Base):
__tablename__ = 'categories'
id = Column(Integer, primary_key=True)
name = Column(String)
parent_id = Column(Integer, ForeignKey('categories.id'))
2. Зарегистрируйте модель в менеджере
ns = NestedSetManager()
ns.register(Category, parent_column='parent_id')
После регистрации left и right заполняются автоматически при добавлении новых записей.
3. Добавление записей
root = Category(name='root')
session.add(root)
session.flush() # left=1, right=2
child = Category(name='child', parent_id=root.id)
session.add(child)
session.flush() # root: left=1, right=4; child: left=2, right=3
4. Перемещение узла
ns.move(session, node, new_parent_id=123)
Метод обновляет parent_id, left и right в памяти и в БД. После вызова нужно сделать session.flush() или session.commit().
5. Удаление узла
При удалении через session.delete() разрыв закрывается автоматически, а дети удалённого узла поднимаются на уровень выше:
# Было: root -> child -> sub
session.delete(child) # sub поднимается к root
session.flush() # Стало: root -> sub
Для каскадного удаления поддерева (удалить node + потомков) используйте ns.delete():
ns.delete(session, node, include_descendants=True)
session.flush()
6. Перестроение дерева
Если значения left/right повреждены (например, после массового импорта):
ns.rebuild(session, Category)
session.commit()
API
NestedSetManager
| Метод | Описание |
|---|---|
register(model, parent_column) |
Зарегистрировать модель |
move(session, node, new_parent_id) |
Переместить узел к новому родителю |
delete(session, node, include_descendants) |
Удалить узел и закрыть разрыв |
rebuild(session, model) |
Перестроить nested set с нуля |
Запросы
| Метод | Результат |
|---|---|
ancestors(session, node) |
Все предки (исключая сам узел) |
descendants(session, node, include_self) |
Все потомки |
children(session, node) |
Непосредственные дети |
subtree(session, node) |
Поддерево (включая узел) |
siblings(session, node) |
Соседние узлы |
depth(session, node) |
Глубина (0 для корня) |
get_roots(session, model) |
Корневые узлы |
get_tree(session, model) |
Все узлы, упорядоченные по left |
is_leaf(node) |
True если лист |
is_root(node) |
True если корень |
Как это работает
before_insert— находит точку вставки (справа от последнего потомка родителя), раздвигаетleft/right, назначает новому узлу(parent_right, parent_right + 1).before_delete— читает актуальныеleft/rightиз БД (в обход кеша сессии), сдвигает все значения правее удаляемого диапазона влево наwidth.move()— закрывает разрыв на старом месте, открывает на новом, обновляетleft/rightузла.- Все операции используют
SELECT ... FOR UPDATEдля избежания race condition.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sqlalchemy_nested_set-0.1.0.tar.gz.
File metadata
- Download URL: sqlalchemy_nested_set-0.1.0.tar.gz
- Upload date:
- Size: 8.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e68da09392c60f8af27ac88afb87e67e4bae8811d458efc188984627b2bee2fa
|
|
| MD5 |
6636992ba4549b3a30ec95c65f38ef06
|
|
| BLAKE2b-256 |
f982624ddeb360db1b6b5c4427d8ca4700f2a4dd8d7206da87385a17c6e9b054
|
File details
Details for the file sqlalchemy_nested_set-0.1.0-py3-none-any.whl.
File metadata
- Download URL: sqlalchemy_nested_set-0.1.0-py3-none-any.whl
- Upload date:
- Size: 6.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9b1590bb768b909bd54d34f8a9093a963b4f78af4e026a01765655cb5a77e443
|
|
| MD5 |
2e0aa89c1eac1e10fcf359f4d16186d0
|
|
| BLAKE2b-256 |
e58cae21db0e517cc86f594687362f4fae360311a8e1364ee5227f6c9e9b3d71
|