Always one in every bunch. :) I hear what you're saying about the import errors. But does it really help to allow work to get done before throwing the error? I would think you'd want to know right up front if you don't have a driver loaded rather then letting a program actually get started up and think you can write data (think fat client app) only to get a connection exception.
But I, of course, could be very wrong about this. I am about many things... Monty Michael Bayer wrote: > > yeah i dont like setup.py develop either :)....but anyway, patch is > good. one thing i have to nail down though is ticket #480. the > main point of that ticket is to cleanly isolate ImportErrors of > actual DBAPI modules apart from the containing dialect module > itself. the dialects are catching all the DBAPI-related > ImportErrors though so its not necessarily blocking this patch (its > just they cant report them nicely). > > > On Mar 26, 2007, at 1:34 PM, Monty Taylor wrote: > >> Michael Bayer wrote: >>> i think using entry points to load in external database dialects is a >>> great idea. >>> >>> though the current six core dialects i think i still want to load via >>> __import__ though since im a big fan of running SA straight out of >>> the source directory (and therefore thered be no entry points for >>> those in that case). >>> >>> so probably a check via __import__('sqlalchemy.databases') first, >>> then an entry point lookup. does that work ? >> Here is a patch that implements use of entry points to load dialects. >> The largest change is actually adding a get_dialect to replace the >> functionality of get_module, since entry points really want to return >> classes, and we only ever use the dialect class from the returned >> module >> anyway... >> >> This does not break code that I have that loads the mysql dialect, and >> it does work with my new code that adds a new dialect - although I >> suppose it's possible it could have broken something I didn't find. >> >> As a side note, I agree with Gaetan - you can run entry points and >> stuff >> out of the current directory, especially if you use setup.py >> develop ... >> but this code does the entry points second, after a check for the >> module >> the old way. >> >> Monty >> >> >> === modified file 'lib/sqlalchemy/engine/strategies.py' >> --- lib/sqlalchemy/engine/strategies.py 2007-02-25 22:44:52 +0000 >> +++ lib/sqlalchemy/engine/strategies.py 2007-03-26 17:03:13 +0000 >> @@ -42,16 +42,16 @@ >> u = url.make_url(name_or_url) >> >> # get module from sqlalchemy.databases >> - module = u.get_module() >> + dialect_cls = u.get_dialect() >> >> dialect_args = {} >> # consume dialect arguments from kwargs >> - for k in util.get_cls_kwargs(module.dialect): >> + for k in util.get_cls_kwargs(dialect_cls): >> if k in kwargs: >> dialect_args[k] = kwargs.pop(k) >> >> # create dialect >> - dialect = module.dialect(**dialect_args) >> + dialect = dialect_cls(**dialect_args) >> >> # assemble connection arguments >> (cargs, cparams) = dialect.create_connect_args(u) >> @@ -71,7 +71,7 @@ >> raise exceptions.DBAPIError("Connection >> failed", e) >> creator = kwargs.pop('creator', connect) >> >> - poolclass = kwargs.pop('poolclass', getattr(module, >> 'poolclass', poollib.QueuePool)) >> + poolclass = kwargs.pop('poolclass', getattr >> (dialect_cls, 'poolclass', poollib.QueuePool)) >> pool_args = {} >> # consume pool arguments from kwargs, translating a >> few of the arguments >> for k in util.get_cls_kwargs(poolclass): >> >> === modified file 'lib/sqlalchemy/engine/url.py' >> --- lib/sqlalchemy/engine/url.py 2007-03-18 22:35:19 +0000 >> +++ lib/sqlalchemy/engine/url.py 2007-03-26 16:47:01 +0000 >> @@ -2,6 +2,7 @@ >> import cgi >> import sys >> import urllib >> +import pkg_resources >> from sqlalchemy import exceptions >> >> """Provide the URL object as well as the make_url parsing >> function.""" >> @@ -69,6 +70,23 @@ >> s += '?' + "&".join(["%s=%s" % (k, self.query[k]) for >> k in keys]) >> return s >> >> + def get_dialect(self): >> + """Return the SQLAlchemy database dialect class >> corresponding to this URL's driver name.""" >> + dialect=None >> + try: >> + module=getattr(__import__('sqlalchemy.databases.%s' % >> self.drivername).databases, self.drivername) >> + dialect=module.dialect >> + except ImportError: >> + if sys.exc_info()[2].tb_next is None: >> + for res in pkg_resources.iter_entry_points >> ('sqlalchemy.databases'): >> + if res.name==self.drivername: >> + dialect=res.load() >> + else: >> + raise >> + if dialect is not None: >> + return dialect >> + raise exceptions.ArgumentError('unknown database %r' % >> self.drivername) >> + >> def get_module(self): >> """Return the SQLAlchemy database module corresponding to >> this URL's driver name.""" >> try: >> >> === modified file 'setup.py' >> --- setup.py 2007-03-23 21:33:24 +0000 >> +++ setup.py 2007-03-26 17:01:51 +0000 >> @@ -10,6 +10,10 @@ >> url = "http://www.sqlalchemy.org", >> packages = find_packages('lib'), >> package_dir = {'':'lib'}, >> + entry_points = { >> + 'sqlalchemy.databases': [ >> + '%s = sqlalchemy.databases.%s:dialect' % (f,f) for f in >> + ['sqlite', 'postgres', 'mysql', 'oracle', 'mssql', >> 'firebird']]}, >> license = "MIT License", >> long_description = """\ >> SQLAlchemy is: >> > > > > --~--~---------~--~----~------------~-------~--~----~ 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 [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---