Interesting. Yes each table was in a different schema in pre-simplified code and I am using SQL server via pyodbc from Linux. I'll try and get a more complete test case shortly.
On 29 Jul 2016 5:53 p.m., "Mike Bayer" <mike...@zzzcomputing.com> wrote: > > > On 07/29/2016 12:27 PM, bsdz wrote: > >> Hi >> >> I'm trying to use DeferredReflection to encapsulate my data model so >> that it can easily be instantiated for different environments. However, >> I am having trouble creating relationships with a NoForeignKeysError >> being raised. I am guessing it is because the table metadata generation >> is being deferred, there's not enough information to create the foreign >> key information and therefore the relationships. >> >> I've simplified my code to the following: >> >> | >> importsqlalchemy assa >> fromsqlalchemy.orm importsessionmaker,relationship >> fromsqlalchemy.ext.declarative importdeclarative_base,DeferredReflection >> >> >> Base=declarative_base(cls=DeferredReflection) >> >> classCountry(Base): >> __tablename__ ='country' >> >> classUser(Base): >> __tablename__ ='user' >> >> country_id =sa.Column(sa.Integer,sa.ForeignKey('country.country_id')) >> country =relationship("Country",uselist=False) >> >> classMyModel(object): >> def__init__(self,env): >> self._engine =sa.create_engine("...") >> Base.metadata.bind =self._engine >> Base.prepare(self._engine) >> >> defcreate_session_maker(self): >> returnsessionmaker(bind=self._engine) >> >> # This code is run in another module. >> mymodel =MyModel("DEV") >> Session=model.create_session_maker() >> session =Session() >> l1 =session.query(User).all() >> | >> >> The following error comes back: >> >> | >> NoForeignKeysError:Couldnotdetermine join condition between parent/child >> tables on relationship User.country -there are noforeign keys linking >> these tables.Ensurethat referencing columns are associated witha >> ForeignKeyorForeignKeyConstraint,orspecify a 'primaryjoin'expression. >> > > can't reproduce. Need information on database in use, and if distinct > schemas are involved. See below, and perhaps try to modify this test case > in your environment to reproduce your failure. > > > import sqlalchemy as sa > from sqlalchemy.orm import sessionmaker, relationship > from sqlalchemy.ext.declarative import declarative_base, DeferredReflection > > e = sa.create_engine("sqlite://", echo=True) > > e.execute(""" > create table country ( > country_id integer primary key > ) > """) > > e.execute(""" > create table user ( > user_id integer primary key, > country_id integer, > foreign key (country_id) references country(country_id) > ) > """) > > > Base = declarative_base(cls=DeferredReflection) > > > class Country(Base): > __tablename__ = 'country' > > > class User(Base): > __tablename__ = 'user' > > country_id = sa.Column(sa.Integer, sa.ForeignKey('country.country_id')) > country = relationship("Country", uselist=False) > > > class MyModel(object): > def __init__(self, env): > self._engine = e > Base.metadata.bind = self._engine > Base.prepare(self._engine) > > def create_session_maker(self): > return sessionmaker(bind=self._engine) > > # This code is run in another module. > mymodel = MyModel("DEV") > Session = mymodel.create_session_maker() > session = Session() > l1 = session.query(User).all() > > print(User.country.property.primaryjoin) > > > > > | >> >> Any suggestions on how I might get around this? >> >> >> Thanks in advance, >> Blair >> >> >> -- >> 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 >> <mailto:sqlalchemy+unsubscr...@googlegroups.com>. >> To post to this group, send email to sqlalchemy@googlegroups.com >> <mailto:sqlalchemy@googlegroups.com>. >> Visit this group at https://groups.google.com/group/sqlalchemy. >> For more options, visit https://groups.google.com/d/optout. >> > > -- > You received this message because you are subscribed to a topic in the > Google Groups "sqlalchemy" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/sqlalchemy/hZ3NVf1S2cE/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > sqlalchemy+unsubscr...@googlegroups.com. > To post to this group, send email to sqlalchemy@googlegroups.com. > Visit this group at https://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. > -- 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 https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.