summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES3
-rw-r--r--lib/sqlalchemy/dialects/mssql/pymssql.py6
-rw-r--r--lib/sqlalchemy/test/testing.py4
-rw-r--r--test/dialect/test_mssql.py26
4 files changed, 31 insertions, 8 deletions
diff --git a/CHANGES b/CHANGES
index 9eab740d6..2acf1b76f 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 b6728c6b0..c5f471942 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 471044742..12cbe5e02 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 f9912317c..e766a8301 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()