OK I rearranged how PG does "checkfirst", to only process a particular named ENUM type once within a particular create/drop sequence without needing to check the DB, so the "checkfirst" flag can now be honored normally. This is in rde4eb56fb6c8 and you can get this at http://hg.sqlalchemy.org/sqlalchemy/archive/de4eb56fb6c8.tar.gz, let me know if any issues remain, thanks !
On Oct 28, 2011, at 1:57 PM, Michael Bayer wrote: > 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. > -- 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.