From b803c73cfc26abfb58cc703e744a39dc5bea890e Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 2 Aug 2009 22:01:04 +0000 Subject: [PATCH] some more mssql --- lib/sqlalchemy/dialects/mssql/base.py | 7 ++++--- lib/sqlalchemy/dialects/mssql/pyodbc.py | 2 +- test/dialect/test_mssql.py | 13 +++++++++++++ test/engine/test_execute.py | 10 +++++++--- test/sql/test_returning.py | 3 ++- 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py index e3fa1d4922..e1126532e1 100644 --- a/lib/sqlalchemy/dialects/mssql/base.py +++ b/lib/sqlalchemy/dialects/mssql/base.py @@ -861,12 +861,13 @@ class MSExecutionContext(default.DefaultExecutionContext): self.cursor.execute("SELECT @@identity AS lastrowid") row = self.cursor.fetchall()[0] # fetchall() ensures the cursor is consumed without closing it self._lastrowid = int(row[0]) - - if self._enable_identity_insert: - self.cursor.execute("SET IDENTITY_INSERT %s OFF" % self.dialect.identifier_preparer.format_table(self.compiled.statement.table)) if (self.isinsert or self.isupdate or self.isdelete) and self.compiled.returning: self._result_proxy = base.FullyBufferedResultProxy(self) + + if self._enable_identity_insert: + self.cursor.execute("SET IDENTITY_INSERT %s OFF" % self.dialect.identifier_preparer.format_table(self.compiled.statement.table)) + def get_lastrowid(self): return self._lastrowid diff --git a/lib/sqlalchemy/dialects/mssql/pyodbc.py b/lib/sqlalchemy/dialects/mssql/pyodbc.py index 5c5d2171a9..9a2a9e4e78 100644 --- a/lib/sqlalchemy/dialects/mssql/pyodbc.py +++ b/lib/sqlalchemy/dialects/mssql/pyodbc.py @@ -49,7 +49,7 @@ class MSExecutionContext_pyodbc(MSExecutionContext): class MSDialect_pyodbc(PyODBCConnector, MSDialect): - supports_sane_rowcount = False + supports_sane_rowcount = True supports_sane_multi_rowcount = False execution_ctx_cls = MSExecutionContext_pyodbc diff --git a/test/dialect/test_mssql.py b/test/dialect/test_mssql.py index e2272c3ca4..05031c068b 100644 --- a/test/dialect/test_mssql.py +++ b/test/dialect/test_mssql.py @@ -378,6 +378,19 @@ class QueryTest(TestBase): tbl.drop() con.execute('drop schema paj') + def test_returning_no_autoinc(self): + meta = MetaData(testing.db) + + table = Table('t1', meta, Column('id', Integer, primary_key=True), Column('data', String(50))) + table.create() + try: + result = table.insert().values(id=1, data=func.lower("SomeString")).returning(table.c.id, table.c.data).execute() + eq_(result.fetchall(), [(1, 'somestring',)]) + finally: + # this will hang if the "SET IDENTITY_INSERT t1 OFF" occurs before the + # result is fetched + table.drop() + def test_delete_schema(self): meta = MetaData(testing.db) con = testing.db.connect() diff --git a/test/engine/test_execute.py b/test/engine/test_execute.py index e520a7b495..d42ffc5c7c 100644 --- a/test/engine/test_execute.py +++ b/test/engine/test_execute.py @@ -88,8 +88,11 @@ class ExecuteTest(TestBase): not testing.db.dialect.implicit_returning)) def test_empty_insert(self): """test that execute() interprets [] as a list with no params""" + result = testing.db.execute(users.insert().values(user_name=bindparam('name')), []) - eq_(result.rowcount, 1) + eq_(testing.db.execute(users.select()).fetchall(), [ + (1, None) + ]) class ProxyConnectionTest(TestBase): @testing.fails_on('firebird', 'Data type unknown') @@ -123,8 +126,8 @@ class ProxyConnectionTest(TestBase): break for engine in ( - engines.testing_engine(options=dict(proxy=MyProxy())), - engines.testing_engine(options=dict(proxy=MyProxy(), strategy='threadlocal')) + engines.testing_engine(options=dict(implicit_returning=False, proxy=MyProxy())), + engines.testing_engine(options=dict(implicit_returning=False, proxy=MyProxy(), strategy='threadlocal')) ): m = MetaData(engine) @@ -136,6 +139,7 @@ class ProxyConnectionTest(TestBase): t1.insert().execute(c1=6) assert engine.execute("select * from t1").fetchall() == [(5, 'some data'), (6, 'foo')] finally: + pass m.drop_all() engine.dispose() diff --git a/test/sql/test_returning.py b/test/sql/test_returning.py index 04cfa4be8f..e076f3fe7c 100644 --- a/test/sql/test_returning.py +++ b/test/sql/test_returning.py @@ -111,7 +111,8 @@ class ReturningTest(TestBase, AssertsExecutionResults): result3 = table.insert().returning(table.c.id).execute({'persons': 4, 'full': False}) eq_([dict(row) for row in result3], [{'id': 4}]) - + + @testing.exclude('firebird', '<', (2, 1), '2.1+ feature') @testing.exclude('postgresql', '<', (8, 2), '8.3+ feature') @testing.fails_on_everything_except('postgresql', 'firebird') -- 2.47.3