Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion django/db/backends/oracle/operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,11 @@ def last_executed_query(self, cursor, sql, params):
statement = statement.replace(
key, force_str(params[key], errors="replace")
)
return statement
return (
super().last_executed_query(cursor, sql, params)
if statement is None
else statement
)

def last_insert_id(self, cursor, table_name, pk_name):
sq_name = self._get_sequence_name(cursor, strip_quotes(table_name), pk_name)
Expand Down
6 changes: 3 additions & 3 deletions django/db/backends/postgresql/operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -302,11 +302,11 @@ def last_executed_query(self, cursor, sql, params):
try:
return self.compose_sql(sql, params)
except errors.DataError:
return None
return super().last_executed_query(cursor, sql, params)
else:
if cursor._query and cursor._query.query is not None:
return cursor._query.query.decode()
return None
return super().last_executed_query(cursor, sql, params)

else:

Expand All @@ -315,7 +315,7 @@ def last_executed_query(self, cursor, sql, params):
# The query attribute is a Psycopg extension to the DB API 2.0.
if cursor.query is not None:
return cursor.query.decode()
return None
return super().last_executed_query(cursor, sql, params)

if is_psycopg3:

Expand Down
13 changes: 13 additions & 0 deletions tests/backends/base/test_operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,19 @@ class DatabaseOperationTests(TestCase):
def setUp(self):
self.ops = BaseDatabaseOperations(connection=connection)

def test_last_executed_query_base_fallback(self):
sql = "INVALID SQL"
params = []
with connection.cursor() as cursor:
cursor.close()
try:
cursor.execute(sql, params)
except connection.features.closed_cursor_error_class:
pass
self.assertIsNotNone(
connection.ops.last_executed_query(cursor, sql, params),
)

@skipIfDBFeature("can_distinct_on_fields")
def test_distinct_on_fields(self):
msg = "DISTINCT ON fields is not supported by this database backend"
Expand Down