2016-06-07 84 views
0

我使用的是pymysql软件包,需要编写一个查询,它将获得3个数字变量,它们将特定日期表示为:年份月份和日期 - 并使用它们。Python中的SQL - 使用全局变量

这将是这样的:

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 ...

任何人都知道这可能有帮助吗? 谢谢!!!

+0

请显示无效的代码。 – syntonym

+0

请用代码更新您的问题,并将其格式化为代码。 – syntonym

+0

您应该使用cursor.execute而不是手动格式化。有关信息,请参见[pep249](https://www.python.org/dev/peps/pep-0249/#id15)。 – syntonym

回答

0

您可以使用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) 
+0

而不是手动格式化sql查询,应该使用[cursor.execute](https://www.python.org/dev/peps/pep-0249/#id15)。这样你就可以从SQLinjections中节省(即使在这种情况下它并不重要),并且没有真正的缺点。 – syntonym

+0

啊伟大的一点 - 谢谢! – ryanmc

0

首先 - 我想说的是,它正常工作与1个查询。当我有2个(或更多)查询和python认为它的变量太多时,问题就开始了。

这是代码。

这部分是获得3个变量:

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

这部分是执行与3个给出PARAMATERS查询:

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 ;

cursor.execute(query.value,(year_var, month_var, day_var))

当我尝试用2个插入子句运行脚本 - 它说我必须有很多var iables。

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

Wdya认为可能?