summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Abramowitz <marc@marc-abramowitz.com>2014-02-13 21:25:21 -0800
committerMarc Abramowitz <marc@marc-abramowitz.com>2014-02-13 21:25:21 -0800
commit9134815951c8dd6abfe254d270d401434ad82fd6 (patch)
treeceafdfe839ed2369d2c3059426ac4ba97f44b713
parent036cb93abfb44f4ab7fdb125eaaf2597a95a0187 (diff)
downloadsqlalchemy-pr/71.tar.gz
Take a stab at implementing nextsetpr/71
for multiple result sets
-rw-r--r--lib/sqlalchemy/engine/result.py13
-rw-r--r--test/engine/test_execute.py18
2 files changed, 29 insertions, 2 deletions
diff --git a/lib/sqlalchemy/engine/result.py b/lib/sqlalchemy/engine/result.py
index 6c98dae18..4d6408f35 100644
--- a/lib/sqlalchemy/engine/result.py
+++ b/lib/sqlalchemy/engine/result.py
@@ -775,18 +775,27 @@ class ResultProxy(object):
return [process_row(metadata, row, processors, keymap)
for row in rows]
- def fetchall(self):
+ def fetchall(self, close=True):
"""Fetch all rows, just like DB-API ``cursor.fetchall()``."""
try:
l = self.process_rows(self._fetchall_impl())
- self.close()
+ if close:
+ self.close()
return l
except Exception as e:
self.connection._handle_dbapi_exception(
e, None, None,
self.cursor, self.context)
+ def nextset(self):
+ try:
+ return self.cursor.nextset()
+ except (AttributeError, self.dialect.dbapi.NotSupportedError):
+ raise exc.NotSupportedError(
+ "This dialect does not support nextset"
+ )
+
def fetchmany(self, size=None):
"""Fetch many rows, just like DB-API
``cursor.fetchmany(size=cursor.arraysize)``.
diff --git a/test/engine/test_execute.py b/test/engine/test_execute.py
index d3bd3c2cd..6e15b3d3c 100644
--- a/test/engine/test_execute.py
+++ b/test/engine/test_execute.py
@@ -59,6 +59,24 @@ class ExecuteTest(fixtures.TestBase):
scalar(stmt)
eq_(result, '%')
+ @testing.fails_on_everything_except('mssql+pymssql')
+ def test_nextset(self):
+ conn = testing.db.connect()
+ test_data = ((1, 'jack'), (2, 'fred'), (3, 'ed'),
+ (4, 'horse'), (5, 'barney'), (6, 'donkey'))
+ for user_id, user_name in test_data:
+ conn.execute('insert into users (user_id, user_name) '
+ 'values (%s, %s)', user_id, user_name)
+ res = conn.execute(
+ """select * from users where user_id in (1, 3, 5) order by user_id
+ select * from users where user_id in (2, 4, 6) order by user_id
+ """)
+ rows = res.fetchall(close=False)
+ assert rows == [(1, 'jack'), (3, 'ed'), (5, 'barney')]
+ res.nextset()
+ rows = res.fetchall()
+ assert rows == [(2, 'fred'), (4, 'horse'), (6, 'donkey')]
+
@testing.fails_on_everything_except('firebird',
'sqlite', '+pyodbc',
'+mxodbc', '+zxjdbc', 'mysql+oursql')