2016-05-31 1 views
-1

Надеюсь, я могу понять свою проблему. спасибо :)Оператор python SQL с переменными без использования% s

Я использую соединение impala (библиотека: от impala.dbapi import connect).

Для выполнения запроса я использую команду выполнения: cursor.execute(query.value, (year_var, month_var,day_var))

Вообще - это работает просто отлично, и с переменными. проблема возникает, когда я использую оператор SQL LIKE (например, как «% seo» - который содержит% s в нем).

1-ый аргумент (query.value) является строкой:

create table bi_db.search_terms as 
select search_query,search_contain,count(*) searches 
from (
select search_query, 
case when lower(search_query) like '%logo%' then 'logo' 
    when lower(search_query) like '%google%' then 'google' 
    when lower(search_query) like '%facebook%' then 'facebook' 
    when lower(search_query) like '%instagram%' then 'instagram' 
    when lower(search_query) like '%etsy%' then 'etsy' 
    when lower(search_query) like '%seo%' then 'seo' 
    when lower(search_query) like '%social media%' then 'social media' 
    else 'else' end as search_contain 
from traffic_db.traffic_parq a 
where year = %s AND month = %s AND day = %s AND controller = 'search' and action in ('gigs','users')   
and search_query is not null and search_query<>'') t 
group by search_query,search_contain 

второй аргумент cursor.execute (например, (year_var, month_var, day_var)) относятся к% с я ставлю на запрос, который я запускаю, чтобы использовать динамические переменные.

** Проблема заключается в том, что питон думает, что имеет 5 аргументов вместо 3. Только что вызвано тем, что у меня есть %seo и %social в LIKE statments **

Кто-нибудь сталкивался с такой проблемой? знаете, как его решить?

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

+1

Возможно использовать '%%' 'буквального% '. –

ответ

0

Вы могли бы избежать буквенные знаки процента в запросе (например, %%seo%%), хотя было бы чище передать модели как параметры для execute(), а также:

sql = """ 
create table bi_db.search_terms as 
select search_query,search_contain,count(*) searches 
from (
select search_query, 
case when lower(search_query) like %s then 'logo' 
... 
""" 
cursor.execute(sql, ('%logo%', ...)) 
+0

Привет, спасибо за ответ :) Сложно для меня изменить параметры выполнения, потому что это общий скрипт, который должен работать на множестве таблиц. Я должен исправить запрос по-другому, который вообще не содержит% s. Вы сказали, что я могу избежать буквальных процентов знаков. Как мне это сделать? Я попробовал двойной знак %%, и python все еще возвращает ошибку. – shayms8

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