diff --git a/sentry_sdk/integrations/django/__init__.py b/sentry_sdk/integrations/django/__init__.py index 848d69460d..05b1489d08 100644 --- a/sentry_sdk/integrations/django/__init__.py +++ b/sentry_sdk/integrations/django/__init__.py @@ -13,6 +13,8 @@ def sql_to_string(sql): if isinstance(sql, psycopg2.sql.SQL): return sql.string + elif isinstance(sql, psycopg2.sql.Composed): + return "".join(x.string for x in sql) return sql @@ -239,13 +241,14 @@ def record_sql(sql, params): hub = Hub.current if hub.get_integration(DjangoIntegration) is None: return - real_sql, real_params = format_sql(sql, params) + with capture_internal_exceptions(): + real_sql, real_params = format_sql(sql, params) - if real_params: - try: - real_sql = format_and_strip(real_sql, real_params) - except Exception: - pass + if real_params: + try: + real_sql = format_and_strip(real_sql, real_params) + except Exception: + pass hub.add_breadcrumb(message=real_sql, category="query") diff --git a/tests/integrations/django/test_basic.py b/tests/integrations/django/test_basic.py index a1236503dd..02140148db 100644 --- a/tests/integrations/django/test_basic.py +++ b/tests/integrations/django/test_basic.py @@ -173,8 +173,17 @@ def test_sql_dict_query_params(sentry_init, capture_events): @pytest.mark.skipif( platform.python_implementation() == "PyPy", reason="psycopg broken on pypy" ) +@pytest.mark.parametrize( + "query", + [ + lambda sql: sql.SQL("SELECT %(my_param)s FROM {mytable}").format( + mytable=sql.Identifier("foobar") + ), + lambda sql: sql.SQL("SELECT %(my_param)s FROM foobar"), + ], +) @pytest.mark.django_db -def test_sql_psycopg2_string_composition(sentry_init, capture_events): +def test_sql_psycopg2_string_composition(sentry_init, capture_events, query): sentry_init(integrations=[DjangoIntegration()], send_default_pii=True) from django.db import connection from psycopg2 import sql as psycopg2_sql @@ -182,18 +191,16 @@ def test_sql_psycopg2_string_composition(sentry_init, capture_events): sql = connection.cursor() events = capture_events() - with pytest.raises(Exception): + with pytest.raises(TypeError): # table doesn't even exist - sql.execute( - psycopg2_sql.SQL("SELECT %(my_param)s FROM people_person"), {"my_param": 10} - ) + sql.execute(query(psycopg2_sql), {"my_param": 10}) capture_message("HI") event, = events crumb, = event["breadcrumbs"] - assert crumb["message"] == ("SELECT 10 FROM people_person") + assert crumb["message"] == ("SELECT 10 FROM foobar") @pytest.mark.django_db