from pydal import DAL, Field
db = DAL("sqlite:memory")
db.define_table("person", Field("name"))
db.person.insert(name="Alex")
db.person.insert(name="Bob")
db.person.insert(name="Carl")
db.define_table("thing", Field("name"), Field("owner_id", "reference person"))
db.thing.insert(name="Boat", owner_id=1)
db.thing.insert(name="Chair", owner_id=1)
db.thing.insert(name="Shoes", owner_id=2)
db.commit()
print("partial workaround 1: limited, sends many queries:")
for row in db(db.thing).select():
print(db._lastsql[0])
print(row.name, row.owner_id.name)
print(db._lastsql[0])
print("partial workaround 2: limited")
direct_join = db(db.thing).select(
db.thing.name, db.person.name, left=db.person.on(db.thing.owner_id == db.person.id)
)
print(db._lastsql[0])
print(direct_join)
# Exception: Select object has no attribute 'type'
# str() around subselect fixes syntax, but has 'thing' in FROM
# which leads to wrong results.
# also: alias doesn't work as expected
print("str(nested_select): wrong results due to 'FROM person, thing ...'")
nested_where = db(db.thing).select(
db.thing.name,
str(
db(db.person.id == db.thing.owner_id)
.nested_select(db.person.name)
.with_alias("owner_name")
),
)
print(db._lastsql[0])
print(nested_where)
# generally, JOIN doesn't work for this kind of subselect
print("str(nested_join): wrong results due to join")
nested_join = db(db.thing).select(
db.thing.name,
str(
db(db.thing.owner_id == db.person.id)
.nested_select(
db.person.name, left=db.person.on(db.thing.owner_id == db.person.id)
)
.with_alias("owner_name")
),
)
print(db._lastsql[0])
print(nested_join)
# query syntax wrong and has "thing" in FROM
print("._select(): syntax error due to missing parantheses/alias")
bare_select = db(db.thing)._select(
db.thing.name, db(db.thing.owner_id == db.person.id)._select(db.person.name)
)
print(bare_select + "\n")
# fixed syntax, but has "thing" in FROM
# produces the wrong results
print("._select() with parantheses added: wrong results")
modified_select = db(db.thing).select(
db.thing.name,
"("
+ db(db.thing.owner_id == db.person.id)._select(db.person.name)[:-1]
+ ") AS owner_name",
)
print(db._lastsql[0])
print(modified_select)