Skip to content

Commit 2e346c1

Browse files
committed
Fix inclusion of DETAIL and HINT in Postgres messages.
1 parent 6607166 commit 2e346c1

File tree

2 files changed

+28
-12
lines changed

2 files changed

+28
-12
lines changed

asyncpg/exceptions/_base.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def get_message_class_for_sqlstate(mcls, code):
6565

6666
class PostgresMessage(metaclass=PostgresMessageMeta):
6767
def __str__(self):
68-
msg = self.message
68+
msg = self.args[0]
6969
if self.detail:
7070
msg += '\nDETAIL: {}'.format(self.detail)
7171
if self.hint:
@@ -87,13 +87,13 @@ def new(cls, fields, query=None):
8787
if field:
8888
mapped[field] = v
8989

90-
e = exccls(mapped.get('message'))
90+
e = exccls(mapped.get('message', ''))
9191
e.__dict__.update(mapped)
9292

9393
return e
9494

9595

96-
class PostgresError(Exception, PostgresMessage):
96+
class PostgresError(PostgresMessage, Exception):
9797
"""Base class for all Postgres errors."""
9898

9999

tests/test_exceptions.py

+25-9
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,28 @@ def test_exceptions_exported(self):
2323
self.assertIsNone(asyncpg.PostgresError.schema_name)
2424

2525
async def test_exceptions_unpacking(self):
26-
with self.assertRaises(asyncpg.UndefinedTableError):
27-
try:
28-
await self.con.execute('SELECT * FROM _nonexistent_')
29-
except asyncpg.UndefinedTableError as e:
30-
self.assertEqual(e.sqlstate, '42P01')
31-
self.assertEqual(e.position, '15')
32-
self.assertEqual(e.query, 'SELECT * FROM _nonexistent_')
33-
self.assertIsNotNone(e.severity)
34-
raise
26+
try:
27+
await self.con.execute('SELECT * FROM _nonexistent_')
28+
except asyncpg.UndefinedTableError as e:
29+
self.assertEqual(e.sqlstate, '42P01')
30+
self.assertEqual(e.position, '15')
31+
self.assertEqual(e.query, 'SELECT * FROM _nonexistent_')
32+
self.assertIsNotNone(e.severity)
33+
else:
34+
self.fail('UndefinedTableError not raised')
35+
36+
async def test_exceptions_str(self):
37+
try:
38+
await self.con.execute('''
39+
CREATE FUNCTION foo() RETURNS bool AS $$ $$ LANGUAGE SQL;
40+
''')
41+
except asyncpg.InvalidFunctionDefinitionError as e:
42+
self.assertEqual(
43+
e.detail,
44+
"Function's final statement must be SELECT or "
45+
"INSERT/UPDATE/DELETE RETURNING.")
46+
self.assertIn(
47+
'DETAIL: Function', str(e)
48+
)
49+
else:
50+
self.fail('InvalidFunctionDefinitionError not raised')

0 commit comments

Comments
 (0)