From: Mike Bayer Date: Sun, 24 Oct 2010 16:00:58 +0000 (-0400) Subject: - mssql+pymssql dialect now honors the "port" portion X-Git-Tag: rel_0_6_5~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a29f130be7a1589566547e94c0e283f0210f27ef;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - mssql+pymssql dialect now honors the "port" portion of the URL instead of discarding it. [ticket:1952] - testing.only_on() accepts db specs optionally as a list --- diff --git a/CHANGES b/CHANGES index 9eab740d69..2acf1b76f6 100644 --- a/CHANGES +++ b/CHANGES @@ -267,6 +267,9 @@ CHANGES Note that reflection of indexes requires SQL Server 2005 or greater. [ticket:1770] + - mssql+pymssql dialect now honors the "port" portion + of the URL instead of discarding it. [ticket:1952] + - informix - *Major* cleanup / modernization of the Informix dialect for 0.6, courtesy Florian Apolloner. diff --git a/lib/sqlalchemy/dialects/mssql/pymssql.py b/lib/sqlalchemy/dialects/mssql/pymssql.py index b6728c6b04..c5f4719426 100644 --- a/lib/sqlalchemy/dialects/mssql/pymssql.py +++ b/lib/sqlalchemy/dialects/mssql/pymssql.py @@ -85,7 +85,9 @@ class MSDialect_pymssql(MSDialect): def create_connect_args(self, url): opts = url.translate_connect_args(username='user') opts.update(url.query) - opts.pop('port', None) + port = opts.pop('port', None) + if port and 'host' in opts: + opts['host'] = "%s:%s" % (opts['host'], port) return [[], opts] def is_disconnect(self, e): @@ -99,4 +101,4 @@ class MSDialect_pymssql(MSDialect): else: return False -dialect = MSDialect_pymssql \ No newline at end of file +dialect = MSDialect_pymssql diff --git a/lib/sqlalchemy/test/testing.py b/lib/sqlalchemy/test/testing.py index 471044742f..12cbe5e029 100644 --- a/lib/sqlalchemy/test/testing.py +++ b/lib/sqlalchemy/test/testing.py @@ -208,9 +208,9 @@ def _block_unconditionally(db, reason): return function_named(maybe, fn_name) return decorate -def only_on(db, reason): +def only_on(dbs, reason): carp = _should_carp_about_exclusion(reason) - spec = db_spec(db) + spec = db_spec(*util.to_list(dbs)) def decorate(fn): fn_name = fn.__name__ def maybe(*args, **kw): diff --git a/test/dialect/test_mssql.py b/test/dialect/test_mssql.py index f9912317c6..e766a8301a 100644 --- a/test/dialect/test_mssql.py +++ b/test/dialect/test_mssql.py @@ -9,7 +9,7 @@ from sqlalchemy import types, exc, schema from sqlalchemy.orm import * from sqlalchemy.sql import table, column from sqlalchemy.databases import mssql -from sqlalchemy.dialects.mssql import pyodbc, mxodbc +from sqlalchemy.dialects.mssql import pyodbc, mxodbc, pymssql from sqlalchemy.engine import url from sqlalchemy.test import * from sqlalchemy.test.testing import eq_, emits_warning_on, \ @@ -866,12 +866,10 @@ class MatchTest(TestBase, AssertsCompiledSQL): class ParseConnectTest(TestBase, AssertsCompiledSQL): - __only_on__ = 'mssql' - @classmethod def setup_class(cls): global dialect - dialect = pyodbc.MSDialect_pyodbc() + dialect = pyodbc.dialect() def test_pyodbc_connect_dsn_trusted(self): u = url.make_url('mssql://mydsn') @@ -957,7 +955,27 @@ class ParseConnectTest(TestBase, AssertsCompiledSQL): connection = dialect.create_connect_args(u) eq_([['DRIVER={SQL Server};Server=hostspec;Database=database;UI' 'D=username;PWD=password'], {}], connection) + + def test_pymssql_port_setting(self): + dialect = pymssql.dialect() + u = \ + url.make_url('mssql+pymssql://scott:tiger@somehost/test') + connection = dialect.create_connect_args(u) + eq_( + [[], {'host': 'somehost', 'password': 'tiger', + 'user': 'scott', 'database': 'test'}], connection + ) + + u = \ + url.make_url('mssql+pymssql://scott:tiger@somehost:5000/test') + connection = dialect.create_connect_args(u) + eq_( + [[], {'host': 'somehost:5000', 'password': 'tiger', + 'user': 'scott', 'database': 'test'}], connection + ) + + @testing.only_on(['mssql+pyodbc', 'mssql+pymssql'], "FreeTDS specific test") def test_bad_freetds_warning(self): engine = engines.testing_engine()