【问题标题】:SQL in Python - using global variablesPython 中的 SQL - 使用全局变量
【发布时间】:2016-10-07 13:35:15
【问题描述】:

我正在使用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...

有人知道这里有什么帮助吗? 谢谢!!!

【问题讨论】:

  • 请显示无效的代码。
  • 请用代码更新您的问题并正确格式化为代码。
  • 您应该使用 cursor.execute 而不是手动格式化。有关信息,请参阅pep249
  • 这里讨论过同样的问题:stackoverflow.com/questions/22372359/…

标签: python sql variables dynamic impala


【解决方案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)

【讨论】:

  • 应该使用cursor.execute,而不是手动格式化sql查询。这样你就可以避免 SQLinjections(即使在这种情况下它并不重要)并且没有真正的缺点。
【解决方案2】:

首先 - 我想说它适用于 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 个给定参数的查询:

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 个插入子句运行脚本时 - 它说我有很多变量。

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

你认为可能吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    相关资源
    最近更新 更多