Question

Writing an app with django, using the psycopg2 engine. It doesn't always seem to want to quote my strings. Here is a test case:

>>> from pypvs.search.models import Addr2zip
>>> kwargs = {
...     'street_name__iexact': 'Common Ground',
...     'state_id__iexact': 'MT',
... }
>>> addrMatch = Addr2zip.objects.extra(
...     where = ['ctystate.zip5 = addr2zip.zip5 AND ctystate.city_name = \'%s\'' % 'Philipsburg'],
...     tables = ['ctystate', 'addr2zip']
... ).filter(**kwargs).order_by('zip5', 'street_name', 'primary_address_low', 'secondary_address_low')
>>> print addrMatch.query
SELECT "addr2zip"."addr2zip_id", "addr2zip"."zip5", "addr2zip"."zip4_low", "addr2zip"."zip4_high", "addr2zip"."street_direction", "addr2zip"."street_name", "addr2zip"."street_suffix", "addr2zip"."street_post_direction", "addr2zip"."primary_address_low", "addr2zip"."primary_address_high", "addr2zip"."primary_address_parity", "addr2zip"."secondary_address", "addr2zip"."secondary_address_low", "addr2zip"."secondary_address_high", "addr2zip"."secondary_address_parity", "addr2zip"."state_id", "addr2zip"."county_code", "addr2zip"."municipality_key", "addr2zip"."urbanization_key", "addr2zip"."record_type" FROM "addr2zip" , "ctystate" WHERE (ctystate.zip5 = addr2zip.zip5 AND ctystate.city_name = Philipsburg AND UPPER("addr2zip"."state_id"::text) = UPPER(MT)  AND UPPER("addr2zip"."street_name"::text) = UPPER(Common Ground) ) ORDER BY "addr2zip"."zip5" ASC, "addr2zip"."street_name" ASC, "addr2zip"."primary_address_low" ASC, "addr2zip"."secondary_address_low" ASC

What could be the reason that these strings are not quoted? For instance, 'Common Ground':

AND UPPER("addr2zip"."street_name"::text) = UPPER(Common Ground)

Not sure if the problem is in my implementation, psycopg2, or the django ORM. I'd appreciate any ideas.

Was it helpful?

Solution

str(query) only returns an approximative representation of the query. Are you trying to pass it to the database?

The query issued with iexact seems correct with Django 1.2.3. The above would result in WHERE UPPER("addr2zip"."street_name"::text) = UPPER(E'Common Ground'). Which version are you using?

OTHER TIPS

To get the query to be executed, use something like:

from django.db import DEFAULT_DB_ALIAS
queryset.query.get_compiler(DEFAULT_DB_ALIAS).as_sql()

But you just pasted it like that yourself:

where = ['ctystate.zip5 = addr2zip.zip5 AND ctystate.city_name = %s' % 'Philipsburg'],

so you got query string constructed with syntax error:

AND ctystate.city_name = Philipsburg
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top