带有变量的python SQL语句,不使用%s

时间:2016-05-31 11:41:03

标签: python sql string variables impala

我希望我能清楚我的问题。谢谢你:))

我使用的是impala连接(库:来自impala.dbapi import connect)。

为了使用execute命令运行查询: cursor.execute(query.value, (year_var, month_var,day_var))

一般来说 - 它的工作正常,也有变量。问题开始于我使用SQL LIKE语句(例如'%seo' - 其中包含%s)。

第一个参数(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))引用%s i&#39; m为了使用动态变量而运行查询。

**问题是python认为它有5个参数而不是3个,这是因为我在LIKE语句中有%seo%social **

有人遇到过这种问题吗?知道怎么解决吗?

非常感谢!

1 个答案:

答案 0 :(得分: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%', ...))