A field from a left join table does not show up in the returned row

19 views
Skip to first unread message

icodk

unread,
Oct 11, 2025, 8:18:26 AM (8 days ago) Oct 11
to py4web
I have a query with two left join but only the fields from the first  left join shows up 
in the returned row
However, the missing field is part of the db._lastsql and if I run the sql query directly 
in a query tool (pgAdmin) it returns this field correctly.
Here is my query:
khRow=db((db.keyholder.id==request.args[0])).select(left=db.shop_product.on(db.keyholder.product==db.shop_product.id)).first()
    db((db.keyholder.id == request.args[0])).select(db.shop_product.limit_val,
                                                    db.shop_product.limit_type,
                                                    db.shop_product.name,
                                                    db.keyholder.product,
                                                    db.keyholder.deposit,
                                                    db.keyholder.expire,
                                                    db.keyholder.open_count_left,
                                                    db.keyholder.price,
                                                    db.shop_price.stripe_price_id
                                                    , left=[
            db.shop_product.on(db.keyholder.product == db.shop_product.id), db.shop_price.on(
                (db.keyholder.product == db.shop_price.product) & (
                            db.keyholder.cust_type == db.shop_price.cust_type))], ).first()

I would expect to be able to read the khRow.shop_price.stripe_price_id
but I get an attribute error and inspecting the khRow in a debugger reviles that the field does not exist in the khRow.
The SQL that this quey produce is:

SELECT "shop_product"."limit_val", "shop_product"."limit_type", "shop_product"."name", "keyholder"."product", "keyholder"."deposit", "keyholder"."expire", "keyholder"."open_count_left", "keyholder"."price", "shop_price"."stripe_price_id"
FROM "keyholder"
LEFT JOIN "shop_product" ON (("keyholder"."product" = "shop_product"."id") AND ("shop_product"."org" = 2))
LEFT JOIN "shop_price" ON ((("keyholder"."product" = "shop_price"."product") AND ("keyholder"."cust_type" = "shop_price"."cust_type")) AND ("shop_price"."org" = 2))
WHERE (("keyholder"."id" = 2519) AND ("keyholder"."org" = 2));

Massimo DiPierro

unread,
Oct 12, 2025, 1:16:21 PM (6 days ago) Oct 12
to py4web
Having some trouble reproducing your problem. This works for me:

from pydal import Field, DAL, QueryBuilder


db = DAL("sqlite:memory")
db.define_table("x", Field("name"))
db.define_table("y", Field("name"))
db.define_table("z", Field("name"), Field("x", "reference x"), Field("y", "reference y"))

x = db.x.insert(name="xxx")
y = db.y.insert(name="yyy")
db.z.insert(name="zzz", x=x, y=y)

rows = db(db.z).select(db.x.name, db.y.name, db.z.name, left = [db.x.on(db.x.id==db.z.x), db.y.on(db.y.id==db.z.y)\
])

for row in rows:
    print(row)

can you send me a minamist complete example to reproduce, perhaps extending my example?
Reply all
Reply to author
Forward
0 new messages