Re: [sqlalchemy] override relationship in subclass

2014-02-12 Thread Michael Bayer

On Feb 11, 2014, at 9:38 PM, Eric Atkin eat...@certusllc.us wrote:

 Hi,
 I want to override a relationship in a subclass to relate to a subclass of 
 the base attributes' related class. Perhaps an example of how I thought it 
 should work:
 
 {{{
 class Load(Base):
 __tablename__ = 'load'
 __mapper_args__ = {
 'polymorphic_identity':'load',
 'polymorphic_on':'polymorphic_type',
 }
 id = Column(Integer, primary_key=True)
 polymorphic_type = Column(Text, nullable=False)
 source_id = Column(Integer, ForeignKey('source.id'))
 source = relationship('Source')
 
 class Production_Load(Load):
 __tablename__ = 'production_load'
 __mapper_args__ = { 'polymorphic_identity':'production_load' }
 id = Column(Integer, ForeignKey('load.id'), primary_key=True)
 source_id = Column(Integer, ForeignKey('measured_source.id'))
 source = relationship('Measured_Source')
 
 class Source(Base):
 __tablename__ = 'source'
 __mapper_args__ = {
 'polymorphic_identity':'source',
 'polymorphic_on':'polymorphic_type',
 }
 id = Column(Integer, primary_key=True)
 polymorphic_type = Column(Text, nullable=False)
 
 class Measured_Source(Source):
 __tablename__ = 'measured_source'
 __mapper_args__ = { 'polymorphic_identity':'measured_source' }
 
 id = Column(Integer, ForeignKey('source.id'), primary_key=True)
 }}}
 
 As you can see, we have Load.source - Source and I want 
 Production_Load.source - Measured_Source, but when I import the models, I 
 get the following warning:
 
 {...}/env/lib/python2.7/site-packages/sqlalchemy/orm/properties.py:1028: 
 SAWarning: Warning: relationship 'source' on mapper 
 'Mapper|Production_Load|production_load' supersedes the same relationship on 
 inherited mapper 'Mapper|Load|load'; this can cause dependency issues during 
 flush
 
 and when I try to use Production_Load.source (class level attr) in a query, I 
 get the following error:
 
 AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' 
 object associated with Production_Load.source has an attribute 'conversion'
 
 Is such a thing possible, even with a re-factor of the models?

“conversion” sounds like an attribute name on your end, but generally being 
able to supersede a relationship like that when the inheritance is not 
“concrete” is not supported.  you’d need to name it to something else.



signature.asc
Description: Message signed with OpenPGP using GPGMail


Re: [sqlalchemy] override relationship in subclass

2014-02-12 Thread Jonathan Vanasco
Couldn't it be handled with a mixin?

{{{
class _LoadCore(Base):
whatever you want for both classes here
pass

class Load(_LoadCore):
__tablename__ = 'load'
__mapper_args__ = {
'polymorphic_identity':'load',
'polymorphic_on':'polymorphic_type',
}
id = Column(Integer, primary_key=True)
polymorphic_type = Column(Text, nullable=False)
source_id = Column(Integer, ForeignKey('source.id'))
source = relationship('Source')

class Production_Load(_LoadCore):
__tablename__ = 'production_load'
__mapper_args__ = { 'polymorphic_identity':'production_load' }
id = Column(Integer, ForeignKey('load.id'), primary_key=True)
source_id = Column(Integer, ForeignKey('measured_source.id'))
source = relationship('Measured_Source')
}}

-- 
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/groups/opt_out.


Re: [sqlalchemy] override relationship in subclass

2014-02-12 Thread Eric Atkin
Yeah sorry I missed that. conversion is an attribute on Measured_Source.
So the intent is that a Production_Load is a Load with its own additional 
attributes over Load as well as a constraint that its source is a 
Measured_Source which has its own attribute extensions over Source. One of 
the goals here is to add that constraint enforcement. I was able to make it 
work with the following hybrid_method and hybrid_method.expression, but the 
isinstance(Production_Load.source, Measured_Source) enforcement is missing.
Eric

{{{
class Production_Load(Load):
__tablename__ = 'production_load'
__mapper_args__ = { 'polymorphic_identity':'production_load' }

id = Column(Integer, ForeignKey('load.id'), primary_key=True)
top = Column(Numeric, nullable=False)
bottom = Column(Numeric, nullable=False)

@hybrid_method
def delta(self):
return (self.top-self.bottom)*self.source.conversion if self.source 
else None

@gdelta.expression
def delta(self):
# not sure about the performance here
return 
(self.top-self.bottom)*select([Measured_Source.conversion]).where(Measured_Source.id==self.source_id).label('delta')
}}}

On Wednesday, February 12, 2014 7:17:08 AM UTC-7, Michael Bayer wrote:


 On Feb 11, 2014, at 9:38 PM, Eric Atkin eat...@certusllc.us javascript: 
 wrote: 

  Hi, 
  I want to override a relationship in a subclass to relate to a subclass 
 of the base attributes' related class. Perhaps an example of how I thought 
 it should work: 
  
  {{{ 
  class Load(Base): 
  __tablename__ = 'load' 
  __mapper_args__ = { 
  'polymorphic_identity':'load', 
  'polymorphic_on':'polymorphic_type', 
  } 
  id = Column(Integer, primary_key=True) 
  polymorphic_type = Column(Text, nullable=False) 
  source_id = Column(Integer, ForeignKey('source.id')) 
  source = relationship('Source') 
  
  class Production_Load(Load): 
  __tablename__ = 'production_load' 
  __mapper_args__ = { 'polymorphic_identity':'production_load' } 
  id = Column(Integer, ForeignKey('load.id'), primary_key=True) 
  source_id = Column(Integer, ForeignKey('measured_source.id')) 
  source = relationship('Measured_Source') 
  
  class Source(Base): 
  __tablename__ = 'source' 
  __mapper_args__ = { 
  'polymorphic_identity':'source', 
  'polymorphic_on':'polymorphic_type', 
  } 
  id = Column(Integer, primary_key=True) 
  polymorphic_type = Column(Text, nullable=False) 
  
  class Measured_Source(Source): 
  __tablename__ = 'measured_source' 
  __mapper_args__ = { 'polymorphic_identity':'measured_source' } 
  
  id = Column(Integer, ForeignKey('source.id'), primary_key=True) 
  }}} 
  
  As you can see, we have Load.source - Source and I want 
 Production_Load.source - Measured_Source, but when I import the models, I 
 get the following warning: 
  
  {...}/env/lib/python2.7/site-packages/sqlalchemy/orm/properties.py:1028: 
 SAWarning: Warning: relationship 'source' on mapper 
 'Mapper|Production_Load|production_load' supersedes the same relationship 
 on inherited mapper 'Mapper|Load|load'; this can cause dependency issues 
 during flush 
  
  and when I try to use Production_Load.source (class level attr) in a 
 query, I get the following error: 
  
  AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' 
 object associated with Production_Load.source has an attribute 'conversion' 
  
  Is such a thing possible, even with a re-factor of the models? 

 “conversion” sounds like an attribute name on your end, but generally 
 being able to supersede a relationship like that when the inheritance is 
 not “concrete” is not supported.  you’d need to name it to something else. 



-- 
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/groups/opt_out.


Re: [sqlalchemy] override relationship in subclass

2014-02-12 Thread Eric Atkin
@gdelta.expression is a typo. Should be @delta.expression.

On Wednesday, February 12, 2014 11:53:05 AM UTC-7, Eric Atkin wrote:

 Yeah sorry I missed that. conversion is an attribute on Measured_Source.
 So the intent is that a Production_Load is a Load with its own additional 
 attributes over Load as well as a constraint that its source is a 
 Measured_Source which has its own attribute extensions over Source. One of 
 the goals here is to add that constraint enforcement. I was able to make it 
 work with the following hybrid_method and hybrid_method.expression, but the 
 isinstance(Production_Load.source, Measured_Source) enforcement is missing.
 Eric

 {{{
 class Production_Load(Load):
 __tablename__ = 'production_load'
 __mapper_args__ = { 'polymorphic_identity':'production_load' }

 id = Column(Integer, ForeignKey('load.id'), primary_key=True)
 top = Column(Numeric, nullable=False)
 bottom = Column(Numeric, nullable=False)

 @hybrid_method
 def delta(self):
 return (self.top-self.bottom)*self.source.conversion if 
 self.source else None

 @gdelta.expression
 def delta(self):
 # not sure about the performance here
 return 
 (self.top-self.bottom)*select([Measured_Source.conversion]).where(Measured_Source.id==self.source_id).label('delta')
 }}}

 On Wednesday, February 12, 2014 7:17:08 AM UTC-7, Michael Bayer wrote:


 On Feb 11, 2014, at 9:38 PM, Eric Atkin eat...@certusllc.us wrote: 

  Hi, 
  I want to override a relationship in a subclass to relate to a subclass 
 of the base attributes' related class. Perhaps an example of how I thought 
 it should work: 
  
  {{{ 
  class Load(Base): 
  __tablename__ = 'load' 
  __mapper_args__ = { 
  'polymorphic_identity':'load', 
  'polymorphic_on':'polymorphic_type', 
  } 
  id = Column(Integer, primary_key=True) 
  polymorphic_type = Column(Text, nullable=False) 
  source_id = Column(Integer, ForeignKey('source.id')) 
  source = relationship('Source') 
  
  class Production_Load(Load): 
  __tablename__ = 'production_load' 
  __mapper_args__ = { 'polymorphic_identity':'production_load' } 
  id = Column(Integer, ForeignKey('load.id'), primary_key=True) 
  source_id = Column(Integer, ForeignKey('measured_source.id')) 
  source = relationship('Measured_Source') 
  
  class Source(Base): 
  __tablename__ = 'source' 
  __mapper_args__ = { 
  'polymorphic_identity':'source', 
  'polymorphic_on':'polymorphic_type', 
  } 
  id = Column(Integer, primary_key=True) 
  polymorphic_type = Column(Text, nullable=False) 
  
  class Measured_Source(Source): 
  __tablename__ = 'measured_source' 
  __mapper_args__ = { 'polymorphic_identity':'measured_source' } 
  
  id = Column(Integer, ForeignKey('source.id'), primary_key=True) 
  }}} 
  
  As you can see, we have Load.source - Source and I want 
 Production_Load.source - Measured_Source, but when I import the models, I 
 get the following warning: 
  
  
 {...}/env/lib/python2.7/site-packages/sqlalchemy/orm/properties.py:1028: 
 SAWarning: Warning: relationship 'source' on mapper 
 'Mapper|Production_Load|production_load' supersedes the same relationship 
 on inherited mapper 'Mapper|Load|load'; this can cause dependency issues 
 during flush 
  
  and when I try to use Production_Load.source (class level attr) in a 
 query, I get the following error: 
  
  AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' 
 object associated with Production_Load.source has an attribute 'conversion' 
  
  Is such a thing possible, even with a re-factor of the models? 

 “conversion” sounds like an attribute name on your end, but generally 
 being able to supersede a relationship like that when the inheritance is 
 not “concrete” is not supported.  you’d need to name it to something else. 



-- 
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/groups/opt_out.


Re: [sqlalchemy] override relationship in subclass

2014-02-12 Thread Michael Bayer

On Feb 12, 2014, at 1:53 PM, Eric Atkin eat...@certusllc.us wrote:

 Yeah sorry I missed that. conversion is an attribute on Measured_Source.
 So the intent is that a Production_Load is a Load with its own additional 
 attributes over Load as well as a constraint that its source is a 
 Measured_Source which has its own attribute extensions over Source. One of 
 the goals here is to add that constraint enforcement. I was able to make it 
 work with the following hybrid_method and hybrid_method.expression, but the 
 isinstance(Production_Load.source, Measured_Source) enforcement is missing.

well you’d make two relationships and your hybrid method would make the choice 
between which one is being accessed.




signature.asc
Description: Message signed with OpenPGP using GPGMail


[sqlalchemy] override relationship in subclass

2014-02-11 Thread Eric Atkin
Hi,
I want to override a relationship in a subclass to relate to a subclass of 
the base attributes' related class. Perhaps an example of how I thought it 
should work:

{{{
class Load(Base):
__tablename__ = 'load'
__mapper_args__ = {
'polymorphic_identity':'load',
'polymorphic_on':'polymorphic_type',
}
id = Column(Integer, primary_key=True)
polymorphic_type = Column(Text, nullable=False)
source_id = Column(Integer, ForeignKey('source.id'))
source = relationship('Source')

class Production_Load(Load):
__tablename__ = 'production_load'
__mapper_args__ = { 'polymorphic_identity':'production_load' }
id = Column(Integer, ForeignKey('load.id'), primary_key=True)
source_id = Column(Integer, ForeignKey('measured_source.id'))
source = relationship('Measured_Source')

class Source(Base):
__tablename__ = 'source'
__mapper_args__ = {
'polymorphic_identity':'source',
'polymorphic_on':'polymorphic_type',
}
id = Column(Integer, primary_key=True)
polymorphic_type = Column(Text, nullable=False)

class Measured_Source(Source):
__tablename__ = 'measured_source'
__mapper_args__ = { 'polymorphic_identity':'measured_source' }

id = Column(Integer, ForeignKey('source.id'), primary_key=True)
}}}

As you can see, we have Load.source - Source and I want 
Production_Load.source - Measured_Source, but when I import the models, I 
get the following warning:

{...}/env/lib/python2.7/site-packages/sqlalchemy/orm/properties.py:1028: 
SAWarning: Warning: relationship 'source' on mapper 
'Mapper|Production_Load|production_load' supersedes the same relationship 
on inherited mapper 'Mapper|Load|load'; this can cause dependency issues 
during flush

and when I try to use Production_Load.source (class level attr) in a query, 
I get the following error:

AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' 
object associated with Production_Load.source has an attribute 'conversion'

Is such a thing possible, even with a re-factor of the models?

Thanks,
Eric

-- 
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/groups/opt_out.