2010-12-13 2 views
0

У меня возникли проблемы при использовании одинарных кавычек в значении вставки для функции plpgsql Это выглядит следующим образом:PLPGSQL используя одиночные кавычки в вызове функции (питон)

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

Это делаются с питоном

Я пытался и '' и '' '' 'и даже' '' '' '' ни один из них, похоже, не работает и возвращает следующую ошибку:

[FAIL] [синтаксическая ошибка при или около "koen" LINE 1: ... 'u.firstname', 'ASC', 'AND (u.firstname LIKE' koe ...

Любая помощь приветствуется!

Большое спасибо!

============== РЕДАКТИРОВАНИЕ =============================== ====

Извините! вот моя 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$$; 

Вот как я вызвать функцию:

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. runSQLTransaction: не хватает аргументов для форматирования строки, результат = [None]

SQLinjection быть добавлены позже;)

Спасибо!

+0

Непонятно, что вы делаете. Пожалуйста, напишите более полный код. Как вы вставляете данные в базу данных? –

+0

Моя ошибка! я отредактировал главный пост – Koen

+0

out_string должен быть IN OUT? – kevpie

ответ

0

Я не знаю, Python хорошо, но это, вероятно, поддерживает привязку данных, где вы сначала подготовить заявление (и вам не нужны кавычки вопросительных знаков там):

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

, а затем вы звоните execute ('koen', 'dirk') или что бы то ни было, эта функция вызывается в Python.

 Смежные вопросы

  • Нет связанных вопросов^_^