From e93ca97baee6b64baf3115259e7e1a8ec05dfced Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Wed, 16 Mar 2011 10:36:48 -0400 Subject: [PATCH] - Added accessors to ResultProxy "returns_rows", "is_insert" [ticket:2089] --- CHANGES | 3 +++ lib/sqlalchemy/engine/base.py | 26 ++++++++++++++++++++++++++ test/sql/test_query.py | 30 ++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/CHANGES b/CHANGES index 5ca828660b..f8383fdaf9 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 972b06ce8a..e88ad82658 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 8f7c4c6a7b..da5b05d0a8 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 -- 2.47.2