summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES2
-rw-r--r--lib/sqlalchemy/engine/base.py7
-rw-r--r--lib/sqlalchemy/engine/default.py3
-rw-r--r--lib/sqlalchemy/engine/strategies.py12
-rw-r--r--lib/sqlalchemy/logging.py6
-rw-r--r--test/engine/parseconnect.py12
6 files changed, 31 insertions, 11 deletions
diff --git a/CHANGES b/CHANGES
index 0cde13096..36817c77f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -20,6 +20,8 @@
entry points. loading the built-in database dialects works the
same as always, but if none found will fall back to trying
pkg_resources to load an external module [ticket:521]
+ - Engine contains a "url" attribute referencing the url.URL object
+ used by create_engine().
- sql:
- keys() of result set columns are not lowercased, come back
exactly as they're expressed in cursor.description. note this
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index 1cea9ffc3..c2ee0c08d 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -676,11 +676,12 @@ class Engine(Connectable):
self.echo = echo
self.logger = logging.instance_logger(self)
- name = property(lambda s:sys.modules[s.dialect.__module__].descriptor()['name'])
+ name = property(lambda s:sys.modules[s.dialect.__module__].descriptor()['name'], doc="String name of the [sqlalchemy.engine#Dialect] in use by this ``Engine``.")
engine = property(lambda s:s)
- dialect = property(lambda s:s._dialect)
+ dialect = property(lambda s:s._dialect, doc="the [sqlalchemy.engine#Dialect] in use by this engine.")
echo = logging.echo_property()
-
+ url = property(lambda s:s.connection_provider.url, doc="The [sqlalchemy.engine.url#URL] object representing this ``Engine`` object's datasource.")
+
def dispose(self):
self.connection_provider.dispose()
diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py
index 92bb9ba72..ae12a8dd0 100644
--- a/lib/sqlalchemy/engine/default.py
+++ b/lib/sqlalchemy/engine/default.py
@@ -12,7 +12,8 @@ from sqlalchemy.engine import base
"""Provide default implementations of the engine interfaces"""
class PoolConnectionProvider(base.ConnectionProvider):
- def __init__(self, pool):
+ def __init__(self, url, pool):
+ self.url = url
self._pool = pool
def get_connection(self):
diff --git a/lib/sqlalchemy/engine/strategies.py b/lib/sqlalchemy/engine/strategies.py
index ed31743d8..7d85de9ad 100644
--- a/lib/sqlalchemy/engine/strategies.py
+++ b/lib/sqlalchemy/engine/strategies.py
@@ -92,7 +92,7 @@ class DefaultEngineStrategy(EngineStrategy):
else:
pool = pool
- provider = self.get_pool_provider(pool)
+ provider = self.get_pool_provider(u, pool)
# create engine.
engineclass = self.get_engine_cls()
@@ -110,7 +110,7 @@ class DefaultEngineStrategy(EngineStrategy):
def pool_threadlocal(self):
raise NotImplementedError()
- def get_pool_provider(self, pool):
+ def get_pool_provider(self, url, pool):
raise NotImplementedError()
def get_engine_cls(self):
@@ -123,8 +123,8 @@ class PlainEngineStrategy(DefaultEngineStrategy):
def pool_threadlocal(self):
return False
- def get_pool_provider(self, pool):
- return default.PoolConnectionProvider(pool)
+ def get_pool_provider(self, url, pool):
+ return default.PoolConnectionProvider(url, pool)
def get_engine_cls(self):
return base.Engine
@@ -138,8 +138,8 @@ class ThreadLocalEngineStrategy(DefaultEngineStrategy):
def pool_threadlocal(self):
return True
- def get_pool_provider(self, pool):
- return threadlocal.TLocalConnectionProvider(pool)
+ def get_pool_provider(self, url, pool):
+ return threadlocal.TLocalConnectionProvider(url, pool)
def get_engine_cls(self):
return threadlocal.TLEngine
diff --git a/lib/sqlalchemy/logging.py b/lib/sqlalchemy/logging.py
index 91326233a..665a5cff9 100644
--- a/lib/sqlalchemy/logging.py
+++ b/lib/sqlalchemy/logging.py
@@ -66,10 +66,16 @@ def is_info_enabled(logger):
class echo_property(object):
level_map={logging.DEBUG : "debug", logging.INFO:True}
+
+ __doc__ = "when ``True``, enable echoing for this element."
+
def __get__(self, instance, owner):
level = logging.getLogger(_get_instance_name(instance)).getEffectiveLevel()
return echo_property.level_map.get(level, False)
+
def __set__(self, instance, value):
+ if instance is None:
+ return self
if value:
default_logging(_get_instance_name(instance))
logging.getLogger(_get_instance_name(instance)).setLevel(value == 'debug' and logging.DEBUG or logging.INFO)
diff --git a/test/engine/parseconnect.py b/test/engine/parseconnect.py
index 49f71f881..967a20ed5 100644
--- a/test/engine/parseconnect.py
+++ b/test/engine/parseconnect.py
@@ -125,7 +125,17 @@ class CreateEngineTest(PersistTest):
assert False
except exceptions.DBAPIError:
assert True
-
+
+ def testurlattr(self):
+ """test the url attribute on ``Engine``."""
+
+ e = create_engine('mysql://scott:tiger@localhost/test', module=MockDBAPI())
+ u = url.make_url('mysql://scott:tiger@localhost/test')
+ e2 = create_engine(u, module=MockDBAPI())
+ assert e.url.drivername == e2.url.drivername == 'mysql'
+ assert e.url.username == e2.url.username == 'scott'
+ assert e2.url is u
+
def testpoolargs(self):
"""test that connection pool args make it thru"""
e = create_engine('postgres://', creator=None, pool_recycle=-1, echo_pool=None, auto_close_cursors=False, disallow_open_cursors=True, module=MockDBAPI())