When using DjangoDebugMiddleware, debug tracking presumes cursor.execute argument is a string, raising an error
See original GitHub issue- What is the current behavior?
When using the DjangoDebugMiddleware
, Graphene Django wraps cursor.execute
calls in a class that logs the query. Among the properties it logs is is_select
, which attempts to guess if a query is a select query by looking for “select” in the argument to cursor.execute
:
"is_select": sql.lower().strip().startswith("select"),
When cursor.execute
is called with a non-string argument, such as a psycopg2 query template, this raises an error:
from django.db import connection
from psycopg2 import sql
with connection.cursor() as cursor:
query = sql.SQL("SELECT * FROM {table}").format(table=sql.Identifier("my_table"))
cursor.execute(query)
This raises:
graphql.error.located_error.GraphQLLocatedError: 'Composed' object has no attribute 'lower'
-
What is the expected behavior? Grahene Django should not presume that the argument to
connection.cursor()
will always be a string, and do appropriate string coercion as needed before calling string methods on it. -
What is the motivation / use case for changing the behavior? Robustness. It’s ideal not to throw exceptions from normal uses of core Django methods which graphene-django monkeypatches.
-
Please tell us about your environment:
- Version: graphene-django 2.5.0
- Platform: Ubuntu Linux 18.04, Django 2.2.12, graphene 2.1.8
Issue Analytics
- State:
- Created 3 years ago
- Reactions:3
- Comments:5 (2 by maintainers)
Top GitHub Comments
Ran into the same issue. A possibly naive solution from playing around in my debugger. It fixed the issue in my case, but unsure of the side effects beyond the scope of this function.
https://github.com/graphql-python/graphene-django/blob/master/graphene_django/debug/sql/tracking.py#L115
I like @mtully-blitz solution, doesn’t appear incorrect.