2012-12-18 41 views
3

我想在使用PostgreSQL數據庫中的LIKE和Psycopg2驅動程序的Django中做一個Raw SELECT。在PostgreSQL上使用LIKE的Django原始SQL查詢

我已經測試了很多我在網上找到的東西,但沒有任何工作。

情況如下。我需要執行SELECT是這樣的:

select distinct on (name, adm1.name, adm2.name_local) 
gn.geonameid, 
case when altnm.iso_language = 'pt' then altnm.alternate_name else gn.name end as name, 
adm1.name as zona, 
adm2.name_local as municipio 
from location_geonameslocal gn 
join location_geonameszone adm1 on adm1.code = gn.country || '.' || gn.admin1 
join location_geonamesmunicipality adm2 on adm2.code = gn.country || '.' || gn.admin1 || '.' || gn.admin2 
left join location_geonamesalternatenames altnm on altnm.geonameid = gn.geonameid 
where 
(gn.fclass = 'P' or gn.fclass = 'A') 
and (altnm.iso_language = 'pt' or altnm.iso_language = 'link' or altnm.iso_language is null or altnm.iso_language = '') 
and gn.country = 'PT' 
and (gn.name like '%Lisboa%' or altnm.alternate_name like '%Lisboa%') 
order by name, adm1.name, adm2.name_local; 

SELECT的重要/問題的部分是這個:

and (gn.name like '%Lisboa%' or altnm.alternate_name like '%Lisboa%') 

我已經寫一個簡單的視圖來測試SELECT,它看起來像這個:

def get_citiesjson_view(request): 
    word = "Lisboa" 
    term = "%" + word + "%" 

    cursor = connection.cursor() 
    cursor.execute("select distinct on (name, adm1.name, adm2.name_local)\ 
      gn.geonameid,\ 
      case when altnm.iso_language = 'pt' then altnm.alternate_name else gn.name end as name,\ 
      adm1.name as zona,\ 
      adm2.name_local as municipio\ 
      from location_geonameslocal gn\ 
      join location_geonameszone adm1 on adm1.code = gn.country || '.' || gn.admin1\ 
      join location_geonamesmunicipality adm2 on adm2.code = gn.country || '.' || gn.admin1 || '.' || gn.admin2\ 
      left join location_geonamesalternatenames altnm on altnm.geonameid = gn.geonameid\ 
      where\ 
      (gn.fclass = 'P' or gn.fclass = 'A')\ 
      and (altnm.iso_language = 'pt' or altnm.iso_language = 'link' or altnm.iso_language is null or altnm.iso_language = '')\ 
      and gn.country = 'PT'\ 
      and (gn.name like %s or altnm.alternate_name like %s)\ 
      order by name, adm1.name, adm2.name_local;", [term, term]) 

    data = cursor.fetchone() 

    mimetype = 'application/json' 
    return HttpResponse(data, mimetype) 

不幸的是,這不起作用,我無法找到方法使其工作。一些線索?


UPDATE:這種形式的實際工作:

cursor.execute("... and (gn.name like %s or altnm.alternate_name like %s)... ", ['%'+term+'%', '%'+term+'%']) 
+0

請您提供得到錯誤的信息和你的模式定義。 – Eelke

+0

那麼你認爲它是固定的?如果不是_does不工作,你的意思是什麼? –

回答

2

這種形式的實際工作:

cursor.execute("... and (gn.name like %s or altnm.alternate_name like %s)... ", ['%'+term+'%', '%'+term+'%'])