Hoihoi
Ik ben bezig met een projectje in python met het pylons framework waar ik een sql join uit wil voeren dmv postgresql. Vrij simpel allemaal , maar het wil maar niet.
Daarom deze post.
Situatie omschrijving:
Ik heb een tabel Fiber (wat een fysiek stuk glasvezel is) en een tabel Line (glasvezel tussen 2 punten, kunnen er ook meerdere zijn ,maar dat is het issue niet).
Ik heb een hele zwik niet relevante velden weggelaten.
Lines hebben een LineName, en bestaan uit een of meerdere Fibers.
Dit alles ligt keurig in sqlalchemy.
Nu wil ik dus het FiberUsed veld uit de Fiber objecten hebben en die per Line uitlezen.
De huidige code werkt zonder die join tussen die 2 tables, en is dus okay. Beide tabellen worden ook op andere plekken gebruikt, dus de ORM is gewoon goed.
Dit werkt bijv prima:
Behalve dan dat dit dus maar op 1 table werkt.
Ik wil nu de Fiber tabel aan de Line tabel hangen met LineName als key.
Nu heb ik een aantal dingen geprobeerd, na het lezen van de sql alchemy join documentatie (http://www.sqlalchemy.org....html#querying-with-joins). Echter wil ik omwille van de leesbaarheid van de code de uitkomst van de join opslaan als losse variabele, zoals dit dus:
Of
Allereerst vind ik het jammer dat dit niet kan. Ik heb onder de bovenstaande regels een if constructie, waar ik gewoon aan query wil refereren als zijnde een reeds-gejoind-object. Imo is het een beetje onzinnig om de join en de order_by in alle 3 (of mischien wel 10
) de branches van die functie op te nemen. De aanzet hiervoor maak ik dus in de bovenste code snippet, daar wil ik de query-variabele assigment vervangen door een query-variabele met die join er al in.
Kan iemand me vertellen hoe ik dit doe?
Ik ben bezig met een projectje in python met het pylons framework waar ik een sql join uit wil voeren dmv postgresql. Vrij simpel allemaal , maar het wil maar niet.
Daarom deze post.
Situatie omschrijving:
Ik heb een tabel Fiber (wat een fysiek stuk glasvezel is) en een tabel Line (glasvezel tussen 2 punten, kunnen er ook meerdere zijn ,maar dat is het issue niet).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| fiberdb=# \d "Fiber";
Table "public.Fiber"
Column | Type | Modifiers
------------------------+--------------------------+-----------------------------------------------------------
FiberID | integer | not null default nextval('"Fiber_FiberID_seq"'::regclass)
LineName | character varying(50) |
FiberUsed | character(1) |
Indexes:
"PRI_Fiber" PRIMARY KEY, btree ("FiberID")
"FKI_Fiber_Line" btree ("LineName")
"fki_" btree ("LineName")
Foreign-key constraints:
"FK_Fiber_Line" FOREIGN KEY ("LineName") REFERENCES "Line"("LineName") ON UPDATE CASCADE ON DELETE RESTRICT |
Ik heb een hele zwik niet relevante velden weggelaten.
Lines hebben een LineName, en bestaan uit een of meerdere Fibers.
Dit alles ligt keurig in sqlalchemy.
Nu wil ik dus het FiberUsed veld uit de Fiber objecten hebben en die per Line uitlezen.
De huidige code werkt zonder die join tussen die 2 tables, en is dus okay. Beide tabellen worden ook op andere plekken gebruikt, dus de ORM is gewoon goed.
Dit werkt bijv prima:
Python:
1
2
3
4
5
6
| def _get_list_Lines_between_Sites(self, site1, site2, LineDiscarded): query = models.Session.query(models.Line) if site2 == None: return query.filter(and_(models.Line.LineDiscarded == LineDiscarded, or_(models.Line.SiteLocationCodeA == site1,models.Line.SiteLocationCodeB == site1))) else: return query.filter(and_(models.Line.LineDiscarded == LineDiscarded, or_(and_(models.Line.SiteLocationCodeA == site1,models.Line.SiteLocationCodeB == site2),and_(models.Line.SiteLocationCodeA == site2,models.Line.SiteLocationCodeB == site1) ))) |
Behalve dan dat dit dus maar op 1 table werkt.
Ik wil nu de Fiber tabel aan de Line tabel hangen met LineName als key.
Nu heb ik een aantal dingen geprobeerd, na het lezen van de sql alchemy join documentatie (http://www.sqlalchemy.org....html#querying-with-joins). Echter wil ik omwille van de leesbaarheid van de code de uitkomst van de join opslaan als losse variabele, zoals dit dus:
code:
1
| query = models.Session.query(models.Line).join(Fiber, Line,Fiber.LineName==Line.LineName).order_by(Line.LineName) |
Of
code:
1
| query = models.Session.query(models.Line).join(Fiber, Line, 'LineName').order_by(Line.LineName) |
Allereerst vind ik het jammer dat dit niet kan. Ik heb onder de bovenstaande regels een if constructie, waar ik gewoon aan query wil refereren als zijnde een reeds-gejoind-object. Imo is het een beetje onzinnig om de join en de order_by in alle 3 (of mischien wel 10
offtopic:
Het klopt dat hier objecten geoutput worden ipv strings oid, maar daar dat lost mijn mako template op.
Het klopt dat hier objecten geoutput worden ipv strings oid, maar daar dat lost mijn mako template op.
Kan iemand me vertellen hoe ik dit doe?