Skip to content
Closed
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
15 changes: 9 additions & 6 deletions sentry_sdk/integrations/django/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -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")

Expand Down
19 changes: 13 additions & 6 deletions tests/integrations/django/test_basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,27 +173,34 @@ 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

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
Expand Down