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.5 (2015-06-25)
Add drilldown_tree method (see #41)
Add custom query atribute to get_tree method
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.
Source Distribution
File details
Details for the file sqlalchemy_mptt-0.1.5.tar.gz
.
File metadata
- Download URL: sqlalchemy_mptt-0.1.5.tar.gz
- Upload date:
- Size: 11.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 431d768c6dbe00eb984d62cedb4b1da393d0131895095bb2b49175c3e8e5a0f0 |
|
MD5 | c8f80cedd4746de44a3b31ce50aea2cc |
|
BLAKE2b-256 | f3b784b91c64032b15e38f6dd98429ec0e5634db6a52fcb707cb85dfb8258fef |