From: Mike Bayer Date: Wed, 16 Mar 2011 14:39:05 +0000 (-0400) Subject: - Added accessors to ResultProxy "returns_rows", "is_insert" X-Git-Tag: rel_0_6_7~24 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=81db86c8f1346be9949ecf54a0709b9e89f88dc4;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Added accessors to ResultProxy "returns_rows", "is_insert" --- diff --git a/CHANGES b/CHANGES index b63c6e1f23..fc0e8c6acc 100644 --- a/CHANGES +++ b/CHANGES @@ -53,6 +53,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 b0442e5142..24415fcf1d 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -2314,6 +2314,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 3e1a26cded..2b4e7a71ae 100644 --- a/test/sql/test_query.py +++ b/test/sql/test_query.py @@ -630,6 +630,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