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.

Reply via email to