Thanks for the advice and for confirming my suspicions. I did find a solution here using CTEs, but yes, I know MySQL definitely does not support them. I'll definitely take a look at Marshmallow.
Greg-- On Wednesday, December 16, 2015 at 6:48:10 PM UTC-6, Jeff Widman wrote: > > 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 <javascript:>> > 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+...@googlegroups.com <javascript:>. >> To post to this group, send email to sqlal...@googlegroups.com >> <javascript:>. >> 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.