SQLAlchemy MPTT mixins (Nested Sets)
Project description
Library for implementing Modified Preorder Tree Traversal with your SQLAlchemy Models and working with trees of Model instances, like django-mptt. Docs http://sqlalchemy-mptt.readthedocs.org/
The nested set model is a particular technique for representing nested sets (also known as trees or hierarchies) in relational databases.
Installing
Install from github:
pip install git+http://github.com/ITCase/sqlalchemy_mptt.git
PyPi:
pip install sqlalchemy_mptt
Source:
python setup.py install
Usage
Add mixin to model
from sqlalchemy import Column, Integer, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy_mptt.mixins import BaseNestedSets
Base = declarative_base()
class Tree(Base, BaseNestedSets):
__tablename__ = "tree"
id = Column(Integer, primary_key=True)
visible = Column(Boolean)
def __repr__(self):
return "<Node (%s)>" % self.id
Tree.register_tree()
Now you can add, move and delete obj
Insert node
node = Tree(parent_id=6)
session.add(node)
level Nested sets example 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level Insert node with parent_id == 6 1 1(1)24 _______________|_________________ | | | 2 2(2)5 6(4)13 14(7)23 | ____|____ ___|____ | | | | | 3 3(3)4 7(5)8 9(6)12 15(8)18 19(10)22 | | | 4 10(23)11 16(9)17 20(11)21
Delete node
node = session.query(Tree).filter(Tree.id == 4).one()
session.delete(node)
level Nested sets example 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level Delete node == 4 1 1(1)16 _______________|_____ | | 2 2(2)5 6(7)15 | ^ 3 3(3)4 7(8)10 11(10)14 | | 4 8(9)9 12(11)13
Update node
node = session.query(Tree).filter(Tree.id == 8).one()
node.parent_id = 5
session.add(node)
level Nested sets example 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level Move 8 - > 5 1 1(1)22 _______________|__________________ | | | 2 2(2)5 6(4)15 16(7)21 | ^ | 3 3(3)4 7(5)12 13(6)14 17(10)20 | | 4 8(8)11 18(11)19 | 5 9(9)10
Move node (support multitree)
Move inside
node = session.query(Tree).filter(Tree.id == 4).one()
node.move_inside("15")
4 -> 15 level Nested sets tree1 1 1(1)16 _______________|_____________________ | | 2 2(2)5 6(7)15 | ^ 3 3(3)4 7(8)10 11(10)14 | | 4 8(9)9 12(11)13 level Nested sets tree2 1 1(12)28 ________________|_______________________ | | | 2 2(13)5 6(15)17 18(18)27 | ^ ^ 3 3(14)4 7(4)12 13(16)14 15(17)16 19(19)22 23(21)26 ^ | | 4 8(5)9 10(6)11 20(20)21 24(22)25
Move after
node = session.query(Tree).filter(Tree.id == 8).one()
node.move_after("5")
level Nested sets example 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level Move 8 after 5 1 1(1)22 _______________|__________________ | | | 2 2(2)5 6(4)15 16(7)21 | ^ | 3 3(3)4 7(5)8 9(8)12 13(6)14 17(10)20 | | 4 10(9)11 18(11)19
Move to top level
node = session.query(Tree).filter(Tree.id == 15).one()
node.move_after("1")
level tree_id = 1 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level tree_id = 2 1 1(15)6 ^ 2 2(16)3 4(17)5 level tree_id = 3 1 1(12)16 _______________| | | 2 2(13)5 6(18)15 | ^ 3 3(14)4 7(19)10 11(21)14 | | 4 8(20)9 12(22)13
Support and Development
To report bugs, use the issue tracker or waffle board.
We welcome any contribution: suggestions, ideas, commits with new futures, bug fixes, refactoring, docs, tests, translations etc
If you have question, contact me sacrud@uralbash.ru or IRC channel #sacrud
License
The project is licensed under the MIT license.
0.1.4 (2015-06-19)
delete method get_pk_with_class_name
Bug Fixes
fix _get_tree_table function for inheritance models
0.1.3 (2015-06-17)
Add test for swap trees
rename get_pk method to get_pk_name
rename get_db_pk method to get_pk_column
rename get_class_pk method to get_pk_with_class_name
Bug Fixes
Fix order of elements in tree
0.1.2 (2015-04-22)
Bug Fixes
Fix MANIFEST.in file
Deprecation
Delete BaseNestedSets.register_tree method
Delete BaseNestedSets.get_tree_recursively method
0.1.1 (2015-04-21)
Features
Add test for rst docs and migrate on new itcase_sphinx_theme (#40)
Bug Fixes
Remove recursion from BaseNestedSets.get_tree method (#39)
0.1.0 (2014-11-18)
Bug Fixes
Fix concurrency issue with multiple session (#36)
Flushing the session now expire the instance and it’s children (#33)
0.0.9 (2014-10-09)
Add MANIFEST.in
New docs
fixes in setup.py
0.0.8 (2014-08-15)
Add CONTRIBUTORS.txt
Features
Automatically register tree classes enhancement (#28)
Added support polymorphic tree models (#24)
Bug Fixes
Fix expire left/right attributes of parent somewhen after the before_insert event (#30)
Fix tree_id is incorrectly set to an existing tree if no parent is set (#23)
Fix package is not installable if sqlalchemy is not (yet) installed (#22)
0.0.7 (2014-08-04)
Add LICENSE.txt
Bug Fixes
fix get_db_pk function
0.0.6 (2014-07-31)
Bug Fixes
Allow the primary key to not be named “id” #20. See https://github.com/ITCase/sqlalchemy_mptt/issues/20
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.