Почему эти строки не будут указаны в запросе psycopg2? - PullRequest
1 голос
/ 25 ноября 2010

Написание приложения с использованием django с использованием движка psycopg2. Кажется, не всегда хочется цитировать мои строки. Вот тестовый пример:

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

В чем может быть причина того, что эти строки не заключены в кавычки? Например, «Общая земля»:

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

Не уверен, что проблема в моей реализации, psycopg2 или django ORM. Буду признателен за любые идеи.

Ответы [ 3 ]

1 голос
/ 26 ноября 2010

str(query) возвращает только приблизительное представление запроса. Вы пытаетесь передать его в базу данных?

Запрос, выданный iexact, кажется правильным с Django 1.2.3. Вышеуказанное приведет к WHERE UPPER("addr2zip"."street_name"::text) = UPPER(E'Common Ground'). Какую версию вы используете?

1 голос
/ 21 декабря 2010

Чтобы получить запрос для выполнения, используйте что-то вроде:

from django.db import DEFAULT_DB_ALIAS
queryset.query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
0 голосов
/ 25 ноября 2010

Но вы просто воткнули это так:

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

, поэтому вы получили строку запроса с синтаксической ошибкой:

AND ctystate.city_name = Philipsburg
...