summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2011-03-16 10:36:48 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2011-03-16 10:36:48 -0400
commite93ca97baee6b64baf3115259e7e1a8ec05dfced (patch)
tree66c1adac5372392ac467f32aa41732d8e0ed7528
parentdbaa3627b6aae5fe5567f189664040a485f34064 (diff)
downloadsqlalchemy-e93ca97baee6b64baf3115259e7e1a8ec05dfced.tar.gz
- Added accessors to ResultProxy "returns_rows", "is_insert"
[ticket:2089]
-rw-r--r--CHANGES3
-rw-r--r--lib/sqlalchemy/engine/base.py26
-rw-r--r--test/sql/test_query.py30
3 files changed, 59 insertions, 0 deletions
diff --git a/CHANGES b/CHANGES
index 5ca828660..f8383fdaf 100644
--- a/CHANGES
+++ b/CHANGES
@@ -465,6 +465,9 @@ CHANGES
of an insert()/update() statement will also use the new
compilation rules. [ticket:2042]
+ - Added accessors to ResultProxy "returns_rows", "is_insert"
+ [ticket:2089]
+
- postgresql
- When explicit sequence execution derives the name
of the auto-generated sequence of a SERIAL column,
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index 972b06ce8..e88ad8265 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -2468,6 +2468,32 @@ class ResultProxy(object):
"""
return self._saved_cursor.lastrowid
+ @property
+ def returns_rows(self):
+ """True if this :class:`.ResultProxy` returns rows.
+
+ I.e. if it is legal to call the methods
+ :meth:`~.ResultProxy.fetchone`,
+ :meth:`~.ResultProxy.fetchmany`
+ :meth:`~.ResultProxy.fetchall`.
+
+ """
+ return self._metadata is not None
+
+ @property
+ def is_insert(self):
+ """True if this :class:`.ResultProxy` is the result
+ of a executing an expression language compiled
+ :func:`.expression.insert` construct.
+
+ When True, this implies that the
+ :attr:`inserted_primary_key` attribute is accessible,
+ assuming the statement did not include
+ a user defined "returning" construct.
+
+ """
+ return self.context.isinsert
+
def _cursor_description(self):
"""May be overridden by subclasses."""
diff --git a/test/sql/test_query.py b/test/sql/test_query.py
index 8f7c4c6a7..da5b05d0a 100644
--- a/test/sql/test_query.py
+++ b/test/sql/test_query.py
@@ -706,6 +706,36 @@ class QueryTest(TestBase):
eq_(r.lastrowid, 1)
+ def test_returns_rows_flag_insert(self):
+ r = testing.db.execute(
+ users.insert(),
+ {'user_id':1, 'user_name':'ed'}
+ )
+ assert r.is_insert
+ assert not r.returns_rows
+
+ def test_returns_rows_flag_update(self):
+ r = testing.db.execute(
+ users.update().values(user_name='fred')
+ )
+ assert not r.is_insert
+ assert not r.returns_rows
+
+ def test_returns_rows_flag_select(self):
+ r = testing.db.execute(
+ users.select()
+ )
+ assert not r.is_insert
+ assert r.returns_rows
+
+ @testing.requires.returning
+ def test_returns_rows_flag_insert_returning(self):
+ r = testing.db.execute(
+ users.insert().returning(users.c.user_id),
+ {'user_id':1, 'user_name':'ed'}
+ )
+ assert r.is_insert
+ assert r.returns_rows
def test_graceful_fetch_on_non_rows(self):
"""test that calling fetchone() etc. on a result that doesn't