]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Add cursor.statusmessage attribute
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Tue, 24 Aug 2021 16:34:38 +0000 (18:34 +0200)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Tue, 24 Aug 2021 16:34:38 +0000 (18:34 +0200)
docs/api/cursors.rst
psycopg/psycopg/cursor.py
tests/test_cursor.py
tests/test_cursor_async.py

index 5785e37c84724078e317f0a24790bf620980617a..f6841683a64f975a50b7ca35d24d083b9838d5df 100644 (file)
@@ -172,6 +172,11 @@ The `!Cursor` class
 
         `!None` if the last operation didn't return a queryset.
 
+    .. autoattribute:: statusmessage
+
+        This is the status tag you typically see in :program:`psql` after
+        a successful command, such as ``CREATE TABLE`` or ``UPDATE 42``.
+
     .. autoattribute:: rowcount
     .. autoattribute:: rownumber
 
index f1f9274d7bc81d32f655e8e52b5e7ebe2bb81926..b826c7e40e2a1f6695f84ad7b972347e72905311 100644 (file)
@@ -169,6 +169,19 @@ class BaseCursor(Generic[ConnectionType, Row]):
         else:
             return None
 
+    @property
+    def statusmessage(self) -> Optional[str]:
+        """
+        The command status tag from the last SQL command executed.
+
+        `!None` if the cursor doesn't have a result available.
+        """
+        msg = self.pgresult.command_status if self.pgresult else None
+        if msg:
+            return msg.decode("utf-8")
+        else:
+            return None
+
     def _make_row_maker(self) -> RowMaker[Row]:
         raise NotImplementedError
 
index d1875aeec3ea72ed738c86fdd7b15ac57072d29c..0f9173daf6ec76646b78911408297b1ed67c9cba 100644 (file)
@@ -42,6 +42,21 @@ def test_weakref(conn):
     assert w() is None
 
 
+def test_statusmessage(conn):
+    cur = conn.cursor()
+    assert cur.statusmessage is None
+
+    cur.execute("select generate_series(1, 10)")
+    assert cur.statusmessage == "SELECT 10"
+
+    cur.execute("create table statusmessage ()")
+    assert cur.statusmessage == "CREATE TABLE"
+
+    with pytest.raises(psycopg.ProgrammingError):
+        cur.execute("wat")
+    assert cur.statusmessage is None
+
+
 def test_execute_many_results(conn):
     cur = conn.cursor()
     assert cur.nextset() is None
index bbc81bdd781f9ce04e67690b95323000d92d15d8..78a411f403ec62020e4005e877ab0972dca70a23 100644 (file)
@@ -42,6 +42,21 @@ async def test_weakref(aconn):
     assert w() is None
 
 
+async def test_statusmessage(aconn):
+    cur = aconn.cursor()
+    assert cur.statusmessage is None
+
+    await cur.execute("select generate_series(1, 10)")
+    assert cur.statusmessage == "SELECT 10"
+
+    await cur.execute("create table statusmessage ()")
+    assert cur.statusmessage == "CREATE TABLE"
+
+    with pytest.raises(psycopg.ProgrammingError):
+        await cur.execute("wat")
+    assert cur.statusmessage is None
+
+
 async def test_execute_many_results(aconn):
     cur = aconn.cursor()
     assert cur.nextset() is None