2010-12-13 4 views
0
plpgsql 기능 그것은 다음과 같습니다에 대한 삽입 값에 작은 따옴표를 사용할 때이 문제가 발생하고

:PLPGSQL

"AND (u.firstname LIKE 'koen') OR (u.firstname LIKE 'dirk')"

이것은 파이썬으로 이루어집니다

나는 \ '와' '과' ''와 '' '와' '' '' '' '' '' '' '' '도 시도했습니다. 아무도 작동하지 않고 다음과 같은 오류를 반환합니다 :

또는 근처 "공원" LINE 1에

[FAIL] 구문 오류 : ... 'u.firstname', 'ASC', 'AND (LIKE u.firstname'... KOE

어떤 도움

을 감사합니다!

고맙습니다.

======================== 편집 ===================== ====

죄송합니다! 여기 내 plpgsql 기능은 다음과 같습니다

def get_members(companyuuid, start, limit, sort, order, querystring = None, filterstring = None): 
    logRequest() 
    def doWork(cursor):   
     if not companyuuid: 
      raise Exception("companyuuid cannot be None!") 

     queryarray = [str(s) for s in querystring.split("|")]   
     queryfields = ['firstname', 'preposition', 'lastname', 'emails', 'mobilenumbers'] 

     temp_querystring = "" 
     for j in xrange(len(queryfields)): 
      for i in xrange(len(queryarray)): 
       temp_querystring += "(u.%s LIKE ''%%%s%'') OR "%(queryfields[j], queryarray[i]) 

     temp_querystring = "AND %s"%temp_querystring.rstrip(" OR ") 
     temp_filterstring = filterstring 
     print "querystring: %s"%temp_querystring 

     heizoodb.call(cursor=cursor, 
         scheme="public", 
         function="get_members", 
         functionArgs=(companyuuid, start, limit, sort, order, temp_querystring, temp_filterstring), 
         returnsValue=True)  

그리고 내 최신 오류 = D

com.gravityzoo.core.libs.sql.PostgreSQLDB :

여기
CREATE FUNCTION get_members(IN in_company_uuid uuid, IN in_start integer, IN in_limit integer, IN in_sort character varying, IN in_order character varying, IN in_querystring CHARACTER VARYING, IN in_filterstring CHARACTER VARYING, IN OUT out_status integer, OUT out_status_description character varying, OUT out_value character varying[]) RETURNS record 
    LANGUAGE plpgsql 
    AS $$DECLARE 

temp_record RECORD; 
temp_out_value VARCHAR[]; 
--temp_member_struct MEMBER_STRUCT; 
temp_iterator INTEGER := 0; 

BEGIN 

FOR temp_record IN EXECUTE ' 
SELECT DISTINCT ON 
    (' || in_sort || ') 
    u.user_uuid, 
    u.firstname, 
    u.preposition, 
    u.lastname, 
    array_to_string_ex(ARRAY(SELECT email FROM emails WHERE user_uuid = u.user_uuid)) as emails, 
    array_to_string_ex(ARRAY(SELECT mobilenumber FROM mobilenumbers WHERE user_uuid = u.user_uuid)) as mobilenumbers, 
    array_to_string_ex(ARRAY(SELECT c.name FROM targetgroupusers AS tgu LEFT JOIN membercategories as mc ON mc.targetgroup_uuid = tgu.targetgroup_uuid LEFT JOIN categories AS c ON mc.category_uuid = c.category_uuid WHERE tgu.user_uuid = u.user_uuid)) as categories, 
    array_to_string_ex(ARRAY(SELECT color FROM membercategories WHERE targetgroup_uuid IN(SELECT targetgroup_uuid FROM targetgroupusers WHERE user_uuid = u.user_uuid))) as colors 
FROM 
    membercategories AS mc 
LEFT JOIN 
    targetgroups AS tg 
ON 
    tg.targetgroup_uuid = mc.targetgroup_uuid 
LEFT JOIN 
    targetgroupusers AS tgu 
ON 
    tgu.targetgroup_uuid = tg.targetgroup_uuid 
LEFT JOIN 
    users AS u 
ON 
    u.user_uuid = tgu.user_uuid 
WHERE 
    mc.company_uuid = ''' || in_company_uuid || ''' 
    ' || in_querystring || ' 
    ' || in_filterstring || ' 
ORDER BY 
    ' || in_sort || ' ' || in_order || ' 
OFFSET 
    ' || in_start || ' 
LIMIT 
    ' || in_limit 

LOOP 
temp_out_value[temp_iterator] = ARRAY[temp_record.user_uuid::VARCHAR(36), 
             temp_record.firstname, 
             temp_record.preposition, 
             temp_record.lastname, 
             temp_record.emails, 
             temp_record.mobilenumbers, 
             temp_record.categories, 
             temp_record.colors]; 
temp_iterator = temp_iterator+1; 
END LOOP; 

out_status := 0; 
out_status_description := 'Members retrieved'; 
out_value := temp_out_value; 

RETURN; 

END$$; 

내가 함수를 호출하는 방법입니다. runSQLTransaction : 형식 문자열 결과 = 없음]

SQL 삽입을위한 충분한 인자 나중에 추가되는)

고마워!

+0

당신이 무엇을하고 있는지 분명하지 않다. 보다 완전한 코드를 게시하십시오. 어떻게 데이터를 데이터베이스에 삽입합니까? –

+0

내 실수! 나는 주된 포스트를 편집했다 – Koen

+0

는 밖으로 나가기로되어있는 out_string인가? – kevpie

답변

0

나는 잘 파이썬 모르지만, 아마 데이터가 먼저 문을 준비하는 경우 바인딩을 지원 (당신은 거기에 물음표 따옴표 필요가 없습니다) : 다음 전화

prepare("..... AND (u.firstname LIKE ?) OR (u.firstname LIKE ?)") 

('공원', '더크')을 실행하는 기능이 파이썬에서 호출되어 어떤 나.

관련 문제