Interesting, thanks Michael. I didn't realize autoload was implied when using DeferredReflection but that makes sense.
Thanks! On Monday, February 17, 2014 7:17:34 PM UTC-5, Michael Bayer wrote: > > > On Feb 17, 2014, at 6:23 PM, Rob Crowell <[email protected] <javascript:>> > wrote: > > I am having a bit of trouble getting DeferredReflection working the way I > want; not sure if I am overlooking something obvious or if I just don't > really understand how it's supposed to work. > > I'm trying to define my models before creating my engine (this does not > work): > > Base = declarative_base(cls=*DeferredReflection*) > > class CityStats(Base): > __tablename__ = 'city_stats' > __table_args__ = {'schema': 'prod', *'autoload': True*} > > if __name__ == '__main__': > engine = create_engine('...') > Base.metadata.bind = engine > Base.prepare(engine) > > > When I run this I get an error creating the CityStats class: > "sqlalchemy.exc.UnboundExecutionError: > No engine is bound to this Table's MetaData. Pass an engine to the Table > via autoload_with=<someengine>, or associate the MetaData with an engine > via metadata.bind=<someengine>” > > > its all about the stack trace, lets look: > > Traceback (most recent call last): > File "test.py", line 8, in <module> > class CityStats(Base): > File > "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/ext/declarative/api.py", line > 53, in __init__ > _as_declarative(cls, classname, cls.__dict__) > File > "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/ext/declarative/base.py", > line 251, in _as_declarative > **table_kw) > File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/sql/schema.py", line > 350, in __new__ > table._init(name, metadata, *args, **kw) > File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/sql/schema.py", line > 423, in _init > self._autoload(metadata, autoload_with, include_columns) > File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/sql/schema.py", line > 439, in _autoload > msg="No engine is bound to this Table's MetaData. " > File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/sql/base.py", line > 459, in _bind_or_error > > what we see here is that this script doesn’t get to create_engine() at > all, it’s trying to hit the database as soon as you say “CityStats(Base)”. > Why is that? Because you have “autoload=True” in your table args, which > means, “reflect this table *right now*”. That is, you are defeating the > purpose of using DeferredReflection. > > The solution is just take out that autoload=True. Any class which > descends from the Base here is automatically part of the “classes to > reflect” since you have DeferredReflection at the base. > > Also, if you’re on 0.9 take a look at the new “automap” extension, I’ve > been using it and it’s pretty keen. There’s one fix for it in > not-yet-released 0.9.3 but it’s only needed if you’re dealing with > inheritance structures. > > > -- 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 [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/groups/opt_out.
