ORMで木構造を扱う

リレーショナルDBで木構造を扱うためにPython向けのORマッパーを書きました。


yatt / python-tree-data-object-relational-mapper

今は隣接リストモデルしか実装していないけれど入れ子集合モデル(https://secure.wikimedia.org/wikipedia/en/wiki/Nested_set_model )もいずれ。

Model.getChildren()で直下の子ノードを取ってこれるので、木構造をトラバースして何か処理を書いたりってのも割と簡単にできたり。

#! /usr/bin/python2.6
# coding: utf-8

import models
import adapter_sqlite3
models.setAdapter(adapter_sqlite3.Sqlite3AdjacencyListModelAdapter())

# 省庁クラス
class Ministry(models.Model):
    cols = [
        ('seq', int),
        ('name', unicode),
        ]
    def __repr__(self):
        return self.name

if __name__ == '__main__':
    Ministry.dump(sortby = lambda n,m: cmp(n.seq, m.seq))
$ sqlite3 table.sqlite 'select * from Ministry'
1|-1|0|内閣
2|1|5|総務省
3|2|2|公害等調整委員会
4|2|3|消防庁
5|2|0|中央選挙管理会
6|2|1|政治資金適正化委員会
7|1|0|内閣官房
8|1|8|財務省
9|8|0|国税庁
10|9|0|国税不服審判所
11|1|13|国土交通省
12|11|6|海上保安庁
13|11|5|運輸安全委員会
14|11|4|気象庁
15|11|1|小笠原総合事務所
16|11|3|観光庁
17|11|0|国土地理院
18|11|2|海難審判所
19|1|2|安全保障会議
20|1|12|経済産業省
21|20|0|中小企業庁
22|20|0|資源エネルギー庁
23|22|0|原子力安全・保安院
24|20|0|特許庁
25|1|10|厚生労働省
26|25|0|中央労働委員会
27|1|4|内閣府
28|27|12|宮内庁
29|27|6|犯罪被害者等施策推進会議
30|27|1|消費者庁
31|27|3|少子化社会対策会議
32|27|0|金融庁
33|27|0|北方対策本部
34|27|14|国家公安委員会
35|34|0|警察庁
36|27|11|官民人材交流センター
37|27|9|国際平和協力本部
38|27|7|自殺総合対策会議
39|27|1|金融危機対応会議
40|27|13|公正取引委員会
41|27|5|中央交通安全対策会議
42|27|10|日本学術会議
43|27|8|消費者政策会議
44|27|2|食育推進会議
45|27|4|高齢社会対策会議
46|1|6|総務省
47|46|0|公安審査委員会
48|46|0|検察庁
49|46|0|公安調査庁
50|1|14|環境省
51|50|0|公害対策会議
52|1|7|外務省
53|52|0|在外公館
54|1|11|農林水産省
55|54|2|水産庁
56|55|1|日本海・九州西広域漁業調整委員会
57|55|2|瀬戸内海広域漁業調整委員会
58|55|0|太平洋広域漁業調整委員会
59|54|1|林野庁
60|54|0|農林水産技術会議
61|1|1|内閣法制局
62|1|9|文部科学省
63|62|1|地震調査研究推進本部
64|62|0|日本学士院
65|62|2|日本ユネスコ国内委員会
66|62|3|文化庁
67|66|0|日本芸術院
68|1|15|防衛省
69|68|9|装備施設本部
70|68|7|情報本部
71|68|5|海上自衛隊
72|68|10|防衛監察本部
73|68|4|陸上自衛隊
74|68|1|陸上幕僚監部
75|68|0|統合幕僚監部
76|68|3|航空幕僚監部
77|68|11|外国軍用品審判所
78|68|6|航空自衛隊
79|68|8|技術研究本部
80|68|2|海上幕僚監部
81|1|3|人事院
82|-1|1|会計監査院
内閣
    内閣官房
    内閣法制局
    安全保障会議
    人事院
    内閣府
        金融庁
        北方対策本部
        消費者庁
        金融危機対応会議
        食育推進会議
        少子化社会対策会議
        高齢社会対策会議
        中央交通安全対策会議
        犯罪被害者等施策推進会議
        自殺総合対策会議
        消費者政策会議
        国際平和協力本部
        日本学術会議
        官民人材交流センター
        宮内庁
        公正取引委員会
        国家公安委員会
            警察庁
    総務省
        中央選挙管理会
        政治資金適正化委員会
        公害等調整委員会
        消防庁
    総務省
        公安審査委員会
        検察庁
        公安調査庁
    外務省
        在外公館
    財務省
        国税庁
            国税不服審判所
    文部科学省
        日本学士院
        地震調査研究推進本部
        日本ユネスコ国内委員会
        文化庁
            日本芸術院
    厚生労働省
        中央労働委員会
    農林水産省
        農林水産技術会議
        林野庁
        水産庁
            太平洋広域漁業調整委員会
            日本海・九州西広域漁業調整委員会
            瀬戸内海広域漁業調整委員会
    経済産業省
        中小企業庁
        資源エネルギー庁
            原子力安全・保安院
        特許庁
    国土交通省
        国土地理院
        小笠原総合事務所
        海難審判所
        観光庁
        気象庁
        運輸安全委員会
        海上保安庁
    環境省
        公害対策会議
    防衛省
        統合幕僚監部
        陸上幕僚監部
        海上幕僚監部
        航空幕僚監部
        陸上自衛隊
        海上自衛隊
        航空自衛隊
        情報本部
        技術研究本部
        装備施設本部
        防衛監察本部
        外国軍用品審判所
会計監査院

今のところ、データベース接続の取り回しがアレだとか、書き込む先のデータベース名が決め打ちだったりとか、削除の動作は部分木全体の削除しかできないとか問題があるけど、これを元にすればフレームワーク向けにちょっといじって組み込むとかできそうな感じ。

参考