2010-11-24 31 views
1

Écrire une application avec django, en utilisant le moteur psycopg2. Il ne semble pas toujours vouloir citer mes cordes. Voici un cas de test:Pourquoi ces chaînes ne seront-elles pas citées par psycopg2 pour la requête?

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

Quelle pourrait être la raison pour laquelle ces chaînes ne sont pas citées? Par exemple, 'Common Ground':

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

Je ne sais pas si le problème est dans ma mise en œuvre, psycopg2, ou ORM django. J'apprécierais des idées.

Répondre

1

str(query) renvoie uniquement une représentation approximative de la requête. Essayez-vous de le transmettre à la base de données?

La requête émise avec iexact semble correcte avec Django 1.2.3. Ce qui précède entraînerait WHERE UPPER("addr2zip"."street_name"::text) = UPPER(E'Common Ground'). Quelle version utilisez-vous?

0

Mais vous venez de coller comme vous-même:

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

si vous avez obtenu chaîne de requête construits avec erreur de syntaxe:

AND ctystate.city_name = Philipsburg 
+0

je reçois celui-là. Mais voyez l'exemple que j'ai utilisé dans le post original pour 'street_name'. –

1

Pour obtenir la requête à exécuter, utiliser quelque chose comme:

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