Hi,
I have a declarative class that I'd like to be able to add an
attribute to: (please ignore the eye burning capitals - it's an
existing schema :-) )
class Schedule(Base):
__tablename__ = "SomeSchedule"
__table_args__ = (
dict(schema="Schedule", useexisting=True)
)
def __str__(self):
return "%s %s to %s" % (self.Name, self.Start, self.End)
query = Session.query_property()
id = Column(Integer, primary_key=True)
NameId = Column(Integer, ForeignKey("reference.name.id"),
nullable=False)
Value = Column(Integer, nullable=False)
Start = Column(Date, nullable=False)
End = Column(Date, nullable=False)
On instances of this class I would like an attribute NextValue which
would be the Value column of the row in the table where self.id ==
next.id and self.End == next.Start
So do I use a column_property like:
rs1 = Schedule.__table__.alias('rs1')
rs2 = Schedule.__table__.alias('rs2')
next_val_select = select([rs2.c.Value], from_obj=[rs1.join(rs2,
rs1.c.NameId==rs2.c.NameId)])\
.where(rs1.c.End==rs2.c.Start)
RollSchedule.NextContract = column_property(next_contract_select)
This gets me almost there, but the from clause in the main select is
aliased to rs2 which means that the columns are messed up:
SELECT [RollSchedule_1].id AS [Schedule_RollSchedule_id],
[RollSchedule_1].[NameId] AS [Schedule_RollSchedule_NameId],
[RollSchedule_1].[Contract] AS [Schedule_RollSchedule_Contract],
[RollSchedule_1].[Start] AS [Schedule_RollSchedule_Start],
[RollSchedule_1].[End] AS [Schedule_RollSchedule_End], (SELECT name_1.
[stringId]
FROM reference.name AS name_1
WHERE name_1.id = [RollSchedule_1].[NameId]) AS anon_1, (SELECT rs2.
[Contract]
FROM [Schedule].[RollSchedule] AS rs1 JOIN [Schedule].[RollSchedule]
AS rs2 ON rs1.[NameId] = rs2.[NameId]
WHERE rs1.[End] = rs2.[Start]) AS anon_2
FROM [Schedule].[RollSchedule] AS rs2
Or should I do it more like this:
RollSchedule.NextRolls = relationship(Schedule,
primaryjoin=(Schedule.NameId==Schedule.NameId) &
(Schedule.End==Schedule.Start),
foreign_keys=[Schedule.NameId],
# lazy="joined",
join_depth=2)
and have an assocaition_proxy.
The query I'm looking for is:
SELECT rs."NameId", rs."Contract", rs."Start", rs."End",
(
SELECT reference.name."stringId"
FROM reference.name
WHERE reference.name.id = rs."NameId") AS anon_1,
(
SELECT rs1."Contract"
FROM "Schedule"."RollSchedule" rs1
JOIN "Schedule"."RollSchedule" rs2
ON rs1.nameId = rs2.nameId
WHERE rs2."End" = rs1."Start" and rs.id = rs2.id
) AS anon_2
FROM "Schedule"."RollSchedule" rs
Thanks in advance
Ben
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.