I can make a ticket for this since the Enum type is using the deprecated event 
system and PG's event here doesn't have access to the "checkfirst" flag.    
Ticket #2311.   For now you'd have to not use the "native" enum type with PG, 
or patch out that "checkfirst=True" inside of postgresql/base.py, since that is 
the source of the issue.


On Oct 28, 2011, at 10:52 AM, lestat wrote:

> If I do this:
> 
> from sqlalchemy import *
> from StringIO import StringIO
> buf = StringIO()
> pg_engine = create_engine('sqlite://', strategy='mock',
> executor=lambda s,p=';': buf.write(s.__str__() + p))
> buf.truncate(0)
> tables = [x[1] for x in sorted(db.metadata.tables.items(), key=lambda
> x: x[0])]
> for table in tables:
>    table.create(pg_engine)
> print buf.getvalue()
> 
> ok, it prints,
> 
> but if I change engine to 'postgres://'
> then sqlalchemy print error:
> 
> ---------------------------------------------------------------------------
> AttributeError                            Traceback (most recent call
> last)
> 
> 
>     59 tables = [x[1] for x in sorted(db.metadata.tables.items(),
> key=lambda x: x[0])]
>     60 for table in tables:
> ---> 61     table.create(pg_engine)
>     62 print buf.getvalue()
>     63
> 
> /usr/lib/python2.7/site-packages/sqlalchemy/schema.pyc in create(self,
> bind, checkfirst)
>    525         bind._run_visitor(ddl.SchemaGenerator,
>    526                             self,
> --> 527                             checkfirst=checkfirst)
>    528
>    529
> 
> /usr/lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyc in
> _run_visitor(self, visitorcallable, element, connection, **kwargs)
>    247             kwargs['checkfirst'] = False
>    248             visitorcallable(self.dialect, self,
> --> 249                                 **kwargs).traverse(element)
>    250
>    251         def execute(self, object, *multiparams, **params):
> 
> /usr/lib/python2.7/site-packages/sqlalchemy/sql/visitors.pyc in
> traverse(self, obj)
>     94         """traverse and visit the given expression
> structure."""
>     95
> ---> 96         return traverse(obj, self.__traverse_options__,
> self._visitor_dict)
>     97
>     98     @util.memoized_property
> 
> /usr/lib/python2.7/site-packages/sqlalchemy/sql/visitors.pyc in
> traverse(obj, opts, visitors)
>    205     """traverse and visit the given expression structure using
> the default iterator."""
>    206
> --> 207     return traverse_using(iterate(obj, opts), obj, visitors)
>    208
>    209 def traverse_depthfirst(obj, opts, visitors):
> 
> /usr/lib/python2.7/site-packages/sqlalchemy/sql/visitors.pyc in
> traverse_using(iterator, obj, visitors)
>    199         meth = visitors.get(target.__visit_name__, None)
>    200         if meth:
> --> 201             meth(target)
>    202     return obj
>    203
> 
> /usr/lib/python2.7/site-packages/sqlalchemy/engine/ddl.pyc in
> visit_table(self, table, create_ok)
>     74
>     75         table.dispatch.before_create(table, self.connection,
> ---> 76
> checkfirst=self.checkfirst)
>     77
>     78         for column in table.columns:
> 
> /usr/lib/python2.7/site-packages/sqlalchemy/event.pyc in
> __call__(self, *args, **kw)
>    272             fn(*args, **kw)
>    273         for fn in self.listeners:
> --> 274             fn(*args, **kw)
>    275
>    276     # I'm not entirely thrilled about the overhead here,
> 
> /usr/lib/python2.7/site-packages/sqlalchemy/schema.pyc in
> adapt_listener(target, connection, **kw)
>    484
>    485         def adapt_listener(target, connection, **kw):
> --> 486             listener(event_name, target, connection)
>    487
>    488         event.listen(self, "" + event_name.replace('-', '_'),
> adapt_listener)
> 
> /usr/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.pyc in
> __call__(self, *arg, **kw)
>    279
>    280     def __call__(self, *arg, **kw):
> --> 281         return getattr(self.target, self.name)(*arg, **kw)
>    282
>    283 def class_hierarchy(cls):
> 
> /usr/lib/python2.7/site-packages/sqlalchemy/types.pyc in
> _on_table_create(self, event, target, bind, **kw)
>   1676         t = self.dialect_impl(bind.dialect)
>   1677         if t.__class__ is not self.__class__ and isinstance(t,
> SchemaType):
> -> 1678             t._on_table_create(event, target, bind, **kw)
>   1679
>   1680     def _on_table_drop(self, event, target, bind, **kw):
> 
> /usr/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/
> base.pyc in _on_table_create(self, event, target, bind, **kw)
>    451
>    452     def _on_table_create(self, event, target, bind, **kw):
> --> 453         self.create(bind=bind, checkfirst=True)
>    454
>    455     def _on_metadata_create(self, event, target, bind, **kw):
> 
> /usr/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/
> base.pyc in create(self, bind, checkfirst)
>    439
>    440         if not checkfirst or \
> --> 441             not bind.dialect.has_type(bind, self.name,
> schema=self.schema):
>    442             bind.execute(CreateEnumType(self))
>    443
> 
> /usr/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/
> base.pyc in has_type(self, connection, type_name, schema)
>   1037                 """
>   1038         cursor = connection.execute(sql.text(query,
> bindparams=bindparams))
> -> 1039         return bool(cursor.scalar())
>   1040
>   1041     def _get_server_version_info(self, connection):
> 
> AttributeError: 'NoneType' object has no attribute 'scalar'
> 
> 
> 
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> To unsubscribe from this group, send email to 
> sqlalchemy+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.
> 

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to