2010-12-13 7 views
0

ich Probleme habe, wenn einfache Anführungszeichen in einem Einsatzwert für eine plpgsql Funktion mit Es sieht wie folgt aus:plpgsql einfache Anführungszeichen in Funktionsaufruf mit (Python)

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

Das mit Python getan wird

Ich habe versucht \ 'und' 'und' '' und '' '' und '' '' und sogar '' '' '' keiner von ihnen scheint zu funktionieren und gibt den folgenden Fehler zurück:

[FAIL] [Syntaxfehler bei oder in der Nähe von "koen" LINE 1: ... 'u.vorname', 'ASC', 'AND (u.vorname LIKE' koe ...

Jede Hilfe ist willkommen!

Vielen Dank!

======================= EDIT ======================= ====

Entschuldigung! hier ist meine plpgsql Funktion:

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

Hier ist, wie ich die Funktion aufrufen:

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)  

Und meine letzte Fehler = D

com.gravityzoo.core.libs.sql.PostgreSQLDB. runSQLTransaction: nicht genügend Argumente für Formatstring, Ergebnis = [None]

SQL-Injection zu später hinzugefügt werden;)

Danke!

+0

Es ist nicht klar, was Sie tun. Bitte poste mehr vollständigen Code. Wie fügen Sie die Daten in die Datenbank ein? –

+0

Mein Fehler! Ich editierte die Hauptpost – Koen

+0

ist out_string sollte IN OUT sein? – kevpie

Antwort

0

Ich weiß Python nicht gut, aber es wahrscheinlich unterstützt Datenbindung, wo Sie zuerst eine Erklärung vorbereitet (und Sie Anführungszeichen um die Fragezeichen dort nicht brauchen):

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

und dann rufen Sie execute ('koen', 'dirk') oder was auch immer diese Funktion in Python heißt.