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.