I have tried calling relationship without foreign_keys or primaryjoin, in which case I get an error message suggesting I specify foreign_keys. Base is the same class for both model classes in the case where this does not work. When each model class has a different Base class things work fine. Also it is a 1-to-1 relationship, I just missed that s in the backref.
On Thursday, June 12, 2014 12:03:29 PM UTC-4, Simon King wrote: > > On Thu, Jun 12, 2014 at 4:39 PM, <ty...@beanfield.com <javascript:>> > wrote: > > I can't seem to construct a relationship against this ServiceInstance > class > > without having > > the Endpoint class inherit from a new declarative_base(). I've tried > several > > different > > methods of calling relationship() and the error messages are fairly > similar. > > Below I've > > shown the two classes as well as the various relationship() calls and > the > > resulting > > errors. I'm new to SQLAlchemy so apologies if I'm overlooking something > very > > basic, but I > > don't understand the errors given that I have service_id = Column( > > ForeignKey(ServiceInstance.service_id), primary_key=True) > > > > class Endpoint(Base): > > __tablename__ = 'endpoints' > > __table_args__ = {'schema': 'nms'} > > > > service_id = Column(ForeignKey(ServiceInstance.service_id), > > primary_key=True) > > endpoint_type = Column(Enum('Service', 'Address')) > > service_instance = relationship( > > ServiceInstance, > > foreign_keys=service_id, > > backref=backref('endpoints', cascade='all, delete-orphan')) > > > > > > class ServiceInstance(Base): > > __tablename__ = 'services' > > __table_args__ = ( > > {'schema': 'customer_inquiry'} > > ) > > > > service_id = Column(Integer, primary_key=True) > > service_instance_id = Column(String(12), unique=True) > > title = Column(String(255)) > > definition_title = Column(String(255), nullable=False) > > description = Column(Text) > > category = Column(ForeignKey(ServiceCategory.category), > nullable=False) > > price = Column(Numeric, CheckConstraint('price >= 0'), > nullable=False) > > units_included = Column( > > Numeric, > > CheckConstraint('units_included IS NULL OR units_included >= > > 0')) > > unit_price = Column( > > Numeric, > > CheckConstraint('unit_price IS NULL OR unit_price >= 0')) > > > > sqlalchemy.exc.NoForeignKeysError: Could not determine join condition > > between parent/child > > tables on relationship Endpoint.service_instance - there are no foreign > keys > > linking these > > tables. Ensure that referencing columns are associated with a > ForeignKey or > > ForeignKeyConstraint, or specify a 'primaryjoin' expression. > > > > > > service_instance = relationship( > > ServiceInstance, > > primaryjoin=service_id == ServiceInstance.service_id, > > backref=backref('endpoints', cascade='all, delete-orphan')) > > > > sqlalchemy.exc.ArgumentError: Could not locate any simple equality > > expressions involving > > locally mapped foreign key columns for primary join condition > > 'nms.endpoints.service_id = > > customer_inquiry.services.service_id' on relationship > > Endpoint.service_instance. > > Ensure that referencing columns are associated with a ForeignKey or > > ForeignKeyConstraint, > > or are annotated in the join condition with the foreign() annotation. To > > allow comparison > > operators other than '==', the relationship can be marked as > viewonly=True. > > > > > > service_instance = relationship( > > ServiceInstance, > > primaryjoin=service_id == ServiceInstance.service_id, > > viewonly=True, > > backref=backref('endpoints', cascade='all, delete-orphan')) > > > > sqlalchemy.exc.ArgumentError: Can't determine relationship direction for > > relationship > > 'Endpoint.service_instance' - foreign key columns are present in neither > the > > parent nor > > the child's mapped tables > > > > With those column definitions, this should Just Work - you shouldn't > need foreign_keys or primaryjoin parameters in the relationship > definition, since there is only 1 foreign key and no ambiguity. > > (I'm slightly confused by your columns though - is service_id really > the only primary key of Endpoint? In which case, this would have to be > a 1-to-1 relationship, but your "endpoints" backref implies that you > expect there to be more than one endpoint per service) > > Did you say that "Base" is the same class in both cases? Foreign key > relationships are looked up in the Metadata instance which is attached > to the declarative_base class, so if you have 2 different Base > classes, SA won't be able to resolve the foreign keys. You can work > around this by getting the 2 Base classes to share the same Metadata > instance: > > > http://docs.sqlalchemy.org/en/rel_0_9/orm/extensions/declarative.html#accessing-the-metadata > > > Hope that helps, > > Simon > -- 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.