Вы можете использовать рекурсию:
import sqlite3
data = list(sqlite3.connect('filename.db').cursor().execute("SELECT * FROM tablename"))
#[[1, 'None', 'd1'], [2, 1, 'd2'], [3, 2, 'd3'], [4, 3, 'd4'], [5, 1, 'd5'], [6, 2, 'd6']]
def group_vals(_start):
return [{'value':a, 'data':c, 'children':group_vals(a)} for a, b, c in data if b == _start]
[[val, _data]] = [[a, c] for a, b, c in data if b == 'None']
new_result = {'value':val, 'data':_data, 'children':group_vals(val)}
Вывод:
{
"value": 1,
"data": "d1",
"children": [
{
"value": 2,
"data": "d2",
"children": [
{
"value": 3,
"data": "d3",
"children": [
{
"value": 4,
"data": "d4",
"children": []
}
]
},
{
"value": 6,
"data": "d6",
"children": []
}
]
},
{
"value": 5,
"data": "d5",
"children": []
}
]
}