Closed zengsun closed 4 years ago
Thank you for reporting this, this is definitely not the desired behaviour. :pensive:
@abondar Could you give me a hand with this? We need to likely alias each join to avoid namespace collisions?
I think this is a bug that needs to be fixed urgently ...
Yes, I agree.
The issue is that Tortoise doesn't alias tables, and since Q was originally written by @abondar I am hoping he can help me implement it. We need aliasing support to support this use case.
Two different FK's to the same model was never tested, so consider it an oversight.
Epic fail :rofl:
class DoubleFK(Model):
name = fields.CharField(max_length=50)
left = fields.ForeignKeyField("models.DoubleFK", null=True, related_name="left_rel")
right = fields.ForeignKeyField("models.DoubleFK", null=True, related_name="right_rel")
one = await DoubleFK.create(name="one")
two = await DoubleFK.create(name="two")
middle = await DoubleFK.create(name="middle", left=one, right=two)
# Query to get middle:
DoubleFK.filter(left__name="one", right__name="two").values('name')
It generates:
SELECT "doublefk2"."name" "name"
FROM "doublefk"
LEFT OUTER JOIN "doublefk" "doublefk2" ON "doublefk2"."id"="doublefk2"."left_id"
WHERE "doublefk2"."name"='one' AND "doublefk2"."name"='two'
It should generate:
SELECT "doublefk"."name" "name"
FROM "doublefk"
LEFT OUTER JOIN "doublefk" "doublefk2" ON "doublefk"."id"="doublefk2"."left_id"
LEFT OUTER JOIN "doublefk" "doublefk3" ON "doublefk"."id"="doublefk3"."right_id"
WHERE "doublefk2"."name"='one' AND "doublefk3"."name"='two'
Hi, please see if #277 resolves it for you? an easy way to test would be pip install https://github.com/tortoise/tortoise-orm/archive/aliased_tables.zip
It's OK ! The problem has been solved.
Released as v0.15.9
Describe the bug
The generated SQL statement is obviously wrong !
Correct SQL statement: