Instead of mapping your table directly, map a select containing the coalesce:

incidents_with_activity = select([incidents,
func.coalesce(...).label('activity')]).alias('incidents_with_activity')
assign_mapper(Incident, incidents_with_activity)

then you can use the activity label anywhere in the ORM queries.

On 2/12/07, Mike Orr <[EMAIL PROTECTED]> wrote:
>
> I have a MySQL table with three date fields.  I need to use the
> coalesced value (i.e., the first one that's not NULL)  in WHERE,
> HAVING, ORDER BY, and I'd like it to also appear as an attribute in my
> session-mapped class.  I can see how to do parts of this, but not how
> to put it all together.
>
> My current task is to get the ten most recent records and display
> their title and date in a Pylons application.
>
> ====
> class Incident(object):
>     pass
>
> assign_mapper(ctx, Incident, incident_table)
>
> activity = sa.func.coalesce(
>     Incident.c.last_entry_date,
>     Incident.c.activity_date,
>     Incident.c.create_date,
>     )
>
> recent = sa.select(
>     [Incident.c.id, Incident.c.title, activity.label("activity")],
>     Incident.c.is_public,
>     order_by=[sa.desc(activity)], limit=10).execute().fetchall()
> ====
>
> This works but I'd rather get the result fields as attributes rather
> than keys.  I could wrap the results in a custom class but I may as
> well use the Incident class that's sitting there.
>
> ====
> class Incident(object):
>     @property
>     def activity(self):
>         return self.last_entry_date or self.activity_date or
> self.create_date
> ====
>
> I haven't tried this yet but I'd be specifying the coalescence twice
> in different ways, which is not ideal.  Is this the best way to go?
>
> I could just use the property and do the sorting/eliminating in
> Python, but then I'd be pulling in all these database records I'll
> never select.
>
> I guess what I'd really like is a calculated column in the table
> object, which I could use in all the clauses and also propagate to
> Incident.  But I'd have to append it to an autoloaded table object,
> because my table has some thirty columns and is maintained by another
> application, so I don't want to keep updating its schema as the
> underlying table changes.
>
> --Mike
>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to