When you do a join, the DAL returns rows the same way the SQL database
returns them. Sounds like you're looking for more of a nested structure,
which would have to be created in Python. web2py doesn't do that out of the
box with joins, but you can get similar functionality using recursive
selects, albeit less efficiently (in this case, it would require two
additional database selects per person, though without requiring any joins):
persons = db(db.person).select()
for person in persons:
pets = person.pet.select()
things = person.thing.select()
person.pet is a Set object defining the set of db.pet records with
db.pet.person_id == person.id. You can then call .select() to retrieve
those records (optionally passing any of the usual arguments to .select()).
Anthony
On Friday, January 24, 2014 5:13:45 PM UTC-5, Apple Mason wrote:
>
> Is there a way to get all the information returned as one row, with the
> focus on a particular person? For example,
>
> <Row {'pet': [{''name': 'Pet1'}, {''name':'Pet2'}], 'person': {'name':
> 'Bob', 'id': 1L}, 'thing': [{'name': 'thing1'}, {'name':'thing2'}]}>
>
> ... Or something similar? This would give me a single row that I can
> iterate through his things or pets if I need to. For example, to print out
> people's information:
>
> for person in persons:
> things = .....
> pets = .......
>
> print "%s %s" % (things, pets)
>
>
>
> Right now the code I have is:
>
> a = db( db.person.id==1).select(db.person.ALL, db.pet.ALL, db.
> thing.ALL,
> left=[db.pet.on(db.person.id==db.pet.person_id),
> db.thing.on(db.person.id==db.thing.person_id)])
>
>
> When I print this out, I get a combination of the same thing, which is a
> mess:
>
>
> <Row {'pet': {'person_id': 1L, 'id': 1L, 'name': 'Pet1'}, 'person': {
> 'name': 'Bob', 'id': 1L}, 'thing': {'person_id': 1L, 'id': 1L, 'name':
> 'thing1'}}>
> <Row {'pet': {'person_id': 1L, 'id': 1L, 'name': 'Pet1'}, 'person': {
> 'name': 'Bob', 'id': 1L}, 'thing': {'person_id': 1L, 'id': 2L, 'name':
> 'thing2'}}>
> <Row {'pet': {'person_id': 1L, 'id': 2L, 'name': 'Pet2'}, 'person': {
> 'name': 'Bob', 'id': 1L}, 'thing': {'person_id': 1L, 'id': 1L, 'name':
> 'thing1'}}>
> <Row {'pet': {'person_id': 1L, 'id': 2L, 'name': 'Pet2'}, 'person': {
> 'name': 'Bob', 'id': 1L}, 'thing': {'person_id': 1L, 'id': 2L, 'name':
> 'thing2'}}>
> <Row {'pet': {'person_id': 1L, 'id': 3L, 'name': 'pet3'}, 'person': {
> 'name': 'Bob', 'id': 1L}, 'thing': {'person_id': 1L, 'id': 1L, 'name':
> 'thing1'}}>
> <Row {'pet': {'person_id': 1L, 'id': 3L, 'name': 'pet3'}, 'person': {
> 'name': 'Bob', 'id': 1L}, 'thing': {'person_id': 1L, 'id': 2L, 'name':
> 'thing2'}}>
>
>
>
>
>
>
> On Wednesday, January 22, 2014 4:40:31 PM UTC-5, Niphlod wrote:
>>
>> I'm guessing you had it wrong....
>>
>> db(main_table.filter == something).select(
>> main_table, other_table,
>> left=[other_table.on(main_table.some_id == other_table.reference),
>> ....
>> ]
>> )
>>
>>
>>
>> On Wednesday, January 22, 2014 10:24:14 PM UTC+1, Apple Mason wrote:
>>>
>>>
>>> I have the following tables:
>>>
>>>
>>> db.define_table('person',
>>> Field('name', 'string'))
>>>
>>> db.define_table('pet',
>>> Field('name', 'string'),
>>> Field('person_id', 'reference person'))
>>>
>>> db.define_table('thing',
>>> Field('name', 'string'),
>>> Field('person_id', 'reference person'))
>>>
>>> I have a person_id given to me, so I want all information about that
>>> person (person's name, all pets, all things).
>>>
>>> I am trying left join, but I am not getting it quite right:
>>>
>>> person = db(db.person.id==person_id).select(db.person.ALL, db.pet.ALL,
>>> db.thing.ALL,
>>>
>>> left=[db.person.on(db.person.id==db.pet.person_id),
>>>
>>>
>>> db.person.on(db.person.id==db.thing.person_id)])
>>>
>>> I get an error:
>>>
>>> OperationalError: ambiguous column name: person.id
>>>
>>
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.