This is a perfectly usable solution. Thanks so much! On Wednesday, September 16, 2015 at 11:39:57 AM UTC-7, Michael Bayer wrote: > > OK, new day, new perspectives. This is the best way to do the mapping / > type: > > class CastToIntegerType(TypeDecorator): > impl = String > > def column_expression(self, col): > return cast(col, Integer) > > def process_bind_param(self, value, dialect): > return str(value) > > > class Person(Base): > __tablename__ = 'person' > id = Column('id_string', CastToIntegerType, primary_key=True) > > pets = relationship( > 'Pets', > primaryjoin='foreign(Pets.person_id)==cast(Person.id, Integer)') > > > > we keep the Python conversion of int to string in Python, then cast in > the primaryjoin. That way lazyload gives us: > > SELECT pets.id AS pets_id, pets.person_id AS pets_person_id > FROM pets > WHERE pets.person_id = CAST(%(param_1)s AS INTEGER) > 2015-09-16 14:37:00,449 INFO sqlalchemy.engine.base.Engine {'param_1': > '5'} > > joinedload gives us: > > SELECT CAST(anon_1.person_id_string AS INTEGER) AS > anon_1_person_id_string, pets_1.id AS pets_1_id, pets_1.person_id AS > pets_1_person_id > FROM (SELECT person.id_string AS person_id_string > FROM person > LIMIT %(param_1)s) AS anon_1 LEFT OUTER JOIN pets AS pets_1 ON > pets_1.person_id = CAST(anon_1.person_id_string AS INTEGER) > > > so no double cast, and also the fact that we have string coersion still > happening in the lazyload is appropriate, as the type converters take > place the same way as they would in the joined load. > > > > >
-- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.