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 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.