diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-04-24 13:00:30 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-04-24 13:00:30 -0400 |
commit | 71c00115747d2fb13423b0b18e728b402f117528 (patch) | |
tree | 64362d2cab5db6af78b45c0304ad98e1c0ab5a0f /lib/sqlalchemy/engine/url.py | |
parent | 998c66fa8b1997453c793da5faa7d4cc436739b2 (diff) | |
download | sqlalchemy-71c00115747d2fb13423b0b18e728b402f117528.tar.gz |
- [feature] Added a new system
for registration of new dialects in-process
without using an entrypoint. See the
docs for "Registering New Dialects".
[ticket:2462]
Diffstat (limited to 'lib/sqlalchemy/engine/url.py')
-rw-r--r-- | lib/sqlalchemy/engine/url.py | 57 |
1 files changed, 15 insertions, 42 deletions
diff --git a/lib/sqlalchemy/engine/url.py b/lib/sqlalchemy/engine/url.py index 392ecda11..5bbdb9d65 100644 --- a/lib/sqlalchemy/engine/url.py +++ b/lib/sqlalchemy/engine/url.py @@ -14,6 +14,7 @@ be used directly and is also accepted directly by ``create_engine()``. import re, urllib from sqlalchemy import exc, util +from sqlalchemy.engine import base class URL(object): @@ -96,49 +97,21 @@ class URL(object): to this URL's driver name. """ - try: - if '+' in self.drivername: - dialect, driver = self.drivername.split('+') - else: - dialect, driver = self.drivername, 'base' - - module = __import__('sqlalchemy.dialects.%s' % (dialect, )).dialects - module = getattr(module, dialect) - if hasattr(module, driver): - module = getattr(module, driver) - else: - module = self._load_entry_point() - if module is None: - raise exc.ArgumentError( - "Could not determine dialect for '%s'." % - self.drivername) - - return module.dialect - except ImportError: - module = self._load_entry_point() - if module is not None: - return module - else: - raise exc.ArgumentError( - "Could not determine dialect for '%s'." % self.drivername) - - def _load_entry_point(self): - """attempt to load this url's dialect from entry points, or return None - if pkg_resources is not installed or there is no matching entry point. - - Raise ImportError if the actual load fails. - - """ - try: - import pkg_resources - except ImportError: - return None - - for res in pkg_resources.iter_entry_points('sqlalchemy.dialects'): - if res.name == self.drivername.replace("+", "."): - return res.load() + if '+' not in self.drivername: + name = self.drivername + else: + name = self.drivername.replace('+', '.') + from sqlalchemy.dialects import registry + cls = registry.load(name) + # check for legacy dialects that + # would return a module with 'dialect' as the + # actual class + if hasattr(cls, 'dialect') and \ + isinstance(cls.dialect, type) and \ + issubclass(cls.dialect, base.Dialect): + return cls.dialect else: - return None + return cls def translate_connect_args(self, names=[], **kw): """Translate url attributes into a dictionary of connection arguments. |