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,
"""
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."""
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