]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed bug where known boolean values used by
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 26 May 2015 14:56:23 +0000 (10:56 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 26 May 2015 14:56:23 +0000 (10:56 -0400)
:func:`.engine_from_config` were not being parsed correctly;
these included ``pool_threadlocal`` and the psycopg2 argument
``use_native_unicode``. fixes #3435
- add legacy_schema_aliasing config parsing for mssql
- move use_native_unicode config arg to the psycopg2 dialect

doc/build/changelog/changelog_10.rst
lib/sqlalchemy/dialects/mssql/base.py
lib/sqlalchemy/dialects/postgresql/psycopg2.py
lib/sqlalchemy/engine/__init__.py
lib/sqlalchemy/engine/default.py
test/dialect/mssql/test_engine.py
test/dialect/postgresql/test_dialect.py
test/engine/test_parseconnect.py

index 2ed4f85513bbc8da765e5bed44d49dc574fe6c4e..038b5b4da1a114a477f810728c27700c5e63f84d 100644 (file)
 .. changelog::
     :version: 1.0.5
 
+    .. change::
+        :tags: bug, engine
+        :tickets: 3435
+
+        Fixed bug where known boolean values used by
+        :func:`.engine_from_config` were not being parsed correctly;
+        these included ``pool_threadlocal`` and the psycopg2 argument
+        ``use_native_unicode``.
+
     .. change::
         :tags: bug, mssql
         :tickets: 3424, 3430
index d61ab19583b194207bbf8623cad1f62156b03caf..928953126b8ee854a98b4072365f48d6ce571362 100644 (file)
@@ -1494,6 +1494,10 @@ class MSDialect(default.DefaultDialect):
         sqltypes.Time: TIME,
     }
 
+    engine_config_types = default.DefaultDialect.engine_config_types.union([
+        ('legacy_schema_aliasing', util.asbool),
+    ])
+
     ischema_names = ischema_names
 
     supports_native_boolean = False
index f66ba9693b46454f07d905c7765eff77d697764f..f83bab2fab0d2471f8801dd4a86833fb65db77ab 100644 (file)
@@ -505,6 +505,10 @@ class PGDialect_psycopg2(PGDialect):
     _has_native_json = False
     _has_native_jsonb = False
 
+    engine_config_types = PGDialect.engine_config_types.union([
+        ('use_native_unicode', util.asbool),
+    ])
+
     colspecs = util.update_copy(
         PGDialect.colspecs,
         {
index 0678dd201cbc1cd1ef90ceb601b3010a1b577652..f1eacf6a6eb0b883dd7353165bd68a2b6e8726fe 100644 (file)
@@ -394,9 +394,9 @@ def engine_from_config(configuration, prefix='sqlalchemy.', **kwargs):
     'prefix' argument indicates the prefix to be searched for.
 
     A select set of keyword arguments will be "coerced" to their
-    expected type based on string values.  In a future release, this
-    functionality will be expanded and include dialect-specific
-    arguments.
+    expected type based on string values.    The set of arguments
+    is extensible per-dialect using the ``engine_config_types`` accessor.
+
     """
 
     options = dict((key[len(prefix):], configuration[key])
index 9330a602c16f9228ec08cf61270768fd3327ef87..9a7b80bfdc3194cf0c8af04b5c9fd3bda4dab2cf 100644 (file)
@@ -61,14 +61,13 @@ class DefaultDialect(interfaces.Dialect):
 
     engine_config_types = util.immutabledict([
         ('convert_unicode', util.bool_or_str('force')),
-        ('pool_timeout', int),
+        ('pool_timeout', util.asint),
         ('echo', util.bool_or_str('debug')),
         ('echo_pool', util.bool_or_str('debug')),
-        ('pool_recycle', int),
-        ('pool_size', int),
-        ('max_overflow', int),
-        ('pool_threadlocal', bool),
-        ('use_native_unicode', bool),
+        ('pool_recycle', util.asint),
+        ('pool_size', util.asint),
+        ('max_overflow', util.asint),
+        ('pool_threadlocal', util.asbool),
     ])
 
     # if the NUMERIC type
index a994b17875df0baa5c3ebfbdf64c4eda4cdce138..26f2d4ce929ef393ac0d398921b4e214d1a89384 100644 (file)
@@ -170,6 +170,16 @@ class ParseConnectTest(fixtures.TestBase):
                               engine.connect)
 
 
+class EngineFromConfigTest(fixtures.TestBase):
+    def test_legacy_schema_flag(self):
+        cfg = {
+            "sqlalchemy.url": "mssql://foodsn",
+            "sqlalchemy.legacy_schema_aliasing": "false"
+        }
+        e = engine_from_config(cfg)
+        eq_(e.dialect.legacy_schema_aliasing, False)
+
+
 class VersionDetectionTest(fixtures.TestBase):
     def test_pymssql_version(self):
         dialect = pymssql.MSDialect_pymssql()
index bdd292fff68c82aa12973688f430a80b78b9ee6b..5d74d54ad6f02dadc301b66550a4ec7cfc9746cf 100644 (file)
@@ -14,6 +14,7 @@ from sqlalchemy.dialects.postgresql import base as postgresql
 import logging
 import logging.handlers
 from sqlalchemy.testing.mock import Mock
+from sqlalchemy.engine import engine_from_config
 
 
 class MiscTest(fixtures.TestBase, AssertsExecutionResults, AssertsCompiledSQL):
@@ -120,6 +121,22 @@ class MiscTest(fixtures.TestBase, AssertsExecutionResults, AssertsCompiledSQL):
         new_encoding = c.execute("show client_encoding").fetchone()[0]
         eq_(new_encoding, test_encoding)
 
+    def test_pg_dialect_use_native_unicode_from_config(self):
+        config = {
+            'sqlalchemy.url': 'postgresql://scott:tiger@somehost/test',
+            'sqlalchemy.use_native_unicode': "false"}
+
+        e = engine_from_config(config, _initialize=False)
+        eq_(e.dialect.use_native_unicode, False)
+
+        config = {
+            'sqlalchemy.url': 'postgresql://scott:tiger@somehost/test',
+            'sqlalchemy.use_native_unicode': "true"}
+
+        e = engine_from_config(config, _initialize=False)
+        eq_(e.dialect.use_native_unicode, True)
+
+
     @testing.only_on(
         ['postgresql+psycopg2', 'postgresql+pg8000',
          'postgresql+psycopg2cffi'],
index fb1f338e65efe4a18a81a2120361c56ed99dd5c9..4601a6bda15b76087ceacb797695387b109869fc 100644 (file)
@@ -138,6 +138,23 @@ class CreateEngineTest(fixtures.TestBase):
                             'z=somevalue')
         assert e.echo is True
 
+    def test_pool_threadlocal_from_config(self):
+        dbapi = mock_dbapi
+
+        config = {
+            'sqlalchemy.url': 'postgresql://scott:tiger@somehost/test',
+            'sqlalchemy.pool_threadlocal': "false"}
+
+        e = engine_from_config(config, module=dbapi, _initialize=False)
+        eq_(e.pool._use_threadlocal, False)
+
+        config = {
+            'sqlalchemy.url': 'postgresql://scott:tiger@somehost/test',
+            'sqlalchemy.pool_threadlocal': "true"}
+
+        e = engine_from_config(config, module=dbapi, _initialize=False)
+        eq_(e.pool._use_threadlocal, True)
+
     def test_pool_reset_on_return_from_config(self):
         dbapi = mock_dbapi