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.

Reply via email to