2010-12-13 42 views
0

Je rencontre des problèmes lors de l'utilisation des guillemets simples dans une valeur d'insertion pour une fonction plpgsql Il ressemble à ceci:plpgsql en utilisant des guillemets simples dans l'appel de fonction (python)

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

Cela se fait avec python

J'ai essayé \ 'et' 'et' '' et '' '' 'et même' '' '' '' aucun d'entre eux ne semble fonctionner et retourner l'erreur suivante:

[FAIL] [erreur de syntaxe à ou près de "koen" LIGNE 1: ... 'u. premier nom', 'ASC', 'AND (un nom de famille comme' koe ...

Toute aide est appréciée!

Merci beaucoup!

ÉDITION =============== ====

Désolé! voici ma fonction plpgsql:

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

Voici comment j'appelle la fonction:

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)  

Et ma dernière erreur = D

com.gravityzoo.core.libs.sql.PostgreSQLDB. runSQLTransaction: pas assez d'arguments pour la chaîne de format, résultat = [Aucun]

à ajouter Injection SQL plus tard;)

Merci!

+0

Ce que vous faites n'est pas clair. Veuillez poster un code plus complet. Comment insérez-vous les données dans la base de données? –

+0

Mon erreur! J'ai édité le poste principal – Koen

+0

est out_string censé être IN OUT? – kevpie

Répondre

0

Je ne sais pas Python bien, mais il supporte probablement la liaison de données où vous devez d'abord préparer une déclaration (et vous n'avez pas besoin de guillemets autour des points d'interrogation là-bas):

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

puis vous appelez execute ('koen', 'dirk') ou quelle que soit la fonction appelée en Python.