You've got to separate issues here--one of retrieving the data, and the
second of serializing it to JSON. They're related, but perhaps easier to
solve if you mentally think of them as distinct problems.

Since you're storing the data as an adjacency list, then you'll need to
either use a recursive function or a while loop to traverse the database
up/down levels of the tree. There's no avoiding that unfortunately.
(Technically if you know the maximum depth of the tree you could use a for
loop, but I would never do that because it isn't future-proof.)

AFAIK MySQL doesn't support Recursive CTEs--there are some hacks posted on
StackOverflow, but it'll almost certainly be eaiser to do this within your
app (although slow because for each level of the tree you're issuing a new
query, processing it within your app, and then re-issuing a new query for
the next level up or down the tree).

For serializing the data as nested JSON, I hear good things about
marshmallow's support for nested json. You could certainly write your own
function, it's just Marshmallow provides some niceties like allowing you to
specify the maximum nesting depth:
https://github.com/marshmallow-code/marshmallow/issues/9

If I were doing it, my first prototype would probably write two
functions--one that maps the adjacency list in SQL to an equivalent list of
lists in Python, and then a second that unwraps the python lists and
serializes them into nested marshmallow json. From there it'll be easier to
decide if it's worthwhile to eliminate the python lists of lists by doing
the serializing inline with traversing the adjacency list.





ᐧ

On Wed, Dec 16, 2015 at 4:08 PM, Horcle <g...@umn.edu> wrote:

> We're using MySQL and need retrieval of all data from the table in the
> format given (nested JSON). Simplest solution would be good (whether in app
> or SQLAlchemy). I tried using the JsonSerializer as noted here
> http://stackoverflow.com/questions/30367450/how-to-create-a-json-object-from-tree-data-structure-in-database,
> but could not get it to work.
>
> Thanks!
>
> Greg--
>
> On Wednesday, December 16, 2015 at 5:42:01 PM UTC-6, Jeff Widman wrote:
>>
>> What database are you using?
>>
>> Are you trying to solve data insert or retrieval?
>>
>> Do you want to do your traversal in your app or use SQLAlchemy to
>> generate a SQL query that does all the work within the DB and then returns
>> the result?
>>
>>
>> ᐧ
>>
>> On Wed, Dec 16, 2015 at 1:28 PM, Horcle <g...@umn.edu> wrote:
>>
>>> I have the following SQLAlchemy class representing an adjacency list:
>>>
>>> class Node(db.Model):
>>>     __tablename__ = 'meds'
>>>     id = Column(Integer, primary_key=True)
>>>     type = Column(String(64))
>>>     name = Column(String(64))
>>>     parent_id = Column(Integer, ForeignKey('node.id'))
>>>     children = relationship("Node")
>>>
>>> I need to create a dictionary to represent a tree of arbitrary depth
>>> that would look like:
>>>
>>>
>>> {
>>> "children": [
>>>     {
>>>       "children": [
>>>         {
>>>           "id": 4,
>>>           "name": "Child1",
>>>           "parent_id": 3,
>>>           "type": "Parent 2"
>>>           "children": [
>>>             {
>>>               "id": 6,
>>>               "name": "Child3",
>>>               "parent_id": 3,
>>>               "type": "Parent 3",
>>>               "children": [...]
>>>             },
>>>             {
>>>               "id": 7,
>>>               "name": "Child4",
>>>               "parent_id": 3,
>>>               "type": "Leaf"
>>>            }
>>>           ]
>>>         },
>>>         {
>>>           "id": 5,
>>>           "name": "Child2",
>>>           "parent_id": 3,
>>>           "type": "Leaf"
>>>         }
>>>       ],
>>>       "id": 3,
>>>       "name": "CardioTest",
>>>       "parent_id": null,
>>>       "type": "Parent"
>>>     }
>>>   ]
>>> }
>>>
>>>
>>> Can this dictionary be built non-recursively? I am not sure how to
>>> manually do this otherwise.
>>>
>>> Thanks in advance!
>>>
>>> Greg--
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "sqlalchemy" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to sqlalchemy+...@googlegroups.com.
>>> To post to this group, send email to sqlal...@googlegroups.com.
>>> Visit this group at https://groups.google.com/group/sqlalchemy.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>
>>
>> --
>>
>> *Jeff Widman*
>> jeffwidman.com <http://www.jeffwidman.com/> | 740-WIDMAN-J (943-6265)
>> <><
>>
> --
> You received this message because you are subscribed to the Google Groups
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
>



-- 

*Jeff Widman*
jeffwidman.com <http://www.jeffwidman.com/> | 740-WIDMAN-J (943-6265)
<><

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to