Python中的SQL - 使用全局变量

时间:2016-06-07 15:01:59

标签: python sql variables dynamic impala

我正在使用pymysql软件包并且需要编写一个查询,该查询将获得表示特定日期的3个数字变量:年月和日 - 并使用它们。

这将是这样的:

INSERT INTO tbl1 

SELECT id, user_id, search_term
FROM main_table 
WHERE year = (var1) AND month = (var2) AND day = (var3);

INSERT INTO tbl2 

SELECT id,user_id, find_term
FROM main_table 
WHERE year = (var1) AND month = (var2) AND day = (var3);

我需要2个插入子句将使用我将在执行查询之前定义的相同var1,var2,var3。

事情是 - 为了有效 - 我需要在同一次运行中做到这一点。 我尝试使用(%s),但问题是python要求我提供6个参数而不仅仅是3个...

任何人都知道这里有什么用处? 谢谢!!!

2 个答案:

答案 0 :(得分:1)

你可以使用python的字符串插值:

v1 = 2016
v2 = 6
v3 = 17

query = """INSERT INTO tbl1 

SELECT id, user_id, search_term
FROM main_table 
WHERE year = {var1} 
AND month = {var2} 
AND day = {var3};

INSERT INTO tbl2 

SELECT id,user_id, find_term
FROM main_table 
WHERE year = {var1} 
AND month = {var2}
AND day = {var3};""".format(var1=v1, var2=v2,var3=v3)

print(query)

答案 1 :(得分:0)

首先 - 我想说它适用于1个查询。当我有2个(或更多)查询并且python认为它有太多变量时问题就开始了。

这是代码。

这部分是为了获得3个变量:

object TestApp extends App { var count = 0 val actorSystem = ActorSystem() val parentActor = actorSystem.actorOf(Props(classOf[MyParentActor])) parentActor ! "Message 1" parentActor ! "Message 2" class MyParentActor extends Actor with ActorLogging{ var childActor: ActorRef = null @throws[Exception](classOf[Exception]) override def preStart(): Unit = { childActor = context.actorOf(Props(classOf[MyChildActor])) } override def receive = { case message: Any => { childActor ! message } } override def supervisorStrategy: SupervisorStrategy = { OneForOneStrategy() { case _: CustomException => Restart case _: Exception => Restart } } } class MyChildActor extends Actor with ActorLogging{ override def preRestart(reason: Throwable, message: Option[Any]): Unit = { message match { case Some(e) => self ! e } } override def receive = { case message: String => { if (count == 0) { count += 1 throw new CustomException("Exception occurred") } log.info("Received message {}", message) } } } class CustomException(message: String) extends RuntimeException(message) }

这部分是用3个给定的参数执行查询:

yesterday = datetime.date.fromordinal(datetime.date.today().toordinal()-1) year_var = yesterday.year month_var = yesterday.month day_var = yesterday.day

query = INSERT INTO tbl1 SELECT id, user_id, search_term FROM main_table WHERE year = %s AND month = %s AND day = %s ; INSERT INTO tbl2 SELECT id,user_id, find_term FROM main_table WHERE year = %s AND month = %s AND day = %s ;

当我尝试使用2个插入子句运行脚本时 - 它说我需要很多变量。

我需要定义某种全局变量,而不是使用%s的东西......

Wdya认为可能吗?