Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中的sql语句中多次使用循环中的变量_Python_Sql_Pandas_Teradata - Fatal编程技术网

如何在Python中的sql语句中多次使用循环中的变量

如何在Python中的sql语句中多次使用循环中的变量,python,sql,pandas,teradata,Python,Sql,Pandas,Teradata,我在pandas中有一个列表,我希望遍历该列表,对于列表中的每个项目,将其应用于SQL查询的多个组件 下面是我一直试图处理的问题,但我没有从结果中得到任何反馈,这让我觉得变量没有正确填充 如果我在python之外运行SQL查询,只使用一个硬编码值,它就可以工作 我错过了什么 import teradata import pandas as pd import numpy as np import datetime start_date = "2017-10-28" stop_date = "2

我在pandas中有一个列表,我希望遍历该列表,对于列表中的每个项目,将其应用于SQL查询的多个组件

下面是我一直试图处理的问题,但我没有从结果中得到任何反馈,这让我觉得变量没有正确填充

如果我在python之外运行SQL查询,只使用一个硬编码值,它就可以工作

我错过了什么

import teradata
import pandas as pd
import numpy as np
import datetime

start_date = "2017-10-28"
stop_date = "2017-10-30"
mydates = pd.date_range(start_date, stop_date, format='%Y-%d-%m')
date_list = [d.strftime('%Y-%m-%d') for d in mydates]

data = []

for x in date_list:
    for row in session.execute("""
    select distinct CAST(? as DATE)as dateId, count(*) 
    FROM tableA
    where last_date>=?-365 and first_date>=?-360
    group by 1""", (x, x, x, )):
        data.append(row)

不能在任何数值运算中使用参数占位符
+-*/
,也不能在字符串运算中使用相同的占位符(即,将通配符运算符连接到类似于
表达式的

因此,只需在将值绑定到
con.execute
cursor.execute
的params参数中的prepared语句之前运行操作即可。此外,对于多个项,元组中不需要逗号结尾,而对于一个项元组,则只需要逗号结尾

import datetime as dt

start_date = dt.datetime.strptime("2017-10-28", '%Y-%m-%d')
stop_date = dt.datetime.strptime("2017-10-30", '%Y-%m-%d')

rng = (stop_date - start_date).days

date_list = [(start_date + dt.timedelta(days=i)).strftime(format='%Y-%m-%d')  
             for i in range(rng+1)]    
last_date_list = [(start_date + dt.timedelta(days=i+365)).strftime(format='%Y-%m-%d')  
                  for i in range(rng+1)]    
first_date_list = [(start_date + dt.timedelta(days=i+360)).strftime(format='%Y-%m-%d')  
                   for i in range(rng+1)]

strSQL = """select distinct CAST(? as date format 'YYYY-MM-DD') as dateId, count(*) 
            from tableA
            where last_date >= cast(? as date format 'YYYY-MM-DD') 
              and first_date >= cast(? as date format 'YYYY-MM-DD')
            group by 1"""

for x, l, f in zip(date_list, last_date_list, first_date_list):
    for row in session.execute(strSQL, (x, l, f)):
        data.append(row)

不能在任何数值运算中使用参数占位符
+-*/
,也不能在字符串运算中使用相同的占位符(即,将通配符运算符连接到类似于
表达式的

因此,只需在将值绑定到
con.execute
cursor.execute
的params参数中的prepared语句之前运行操作即可。此外,对于多个项,元组中不需要逗号结尾,而对于一个项元组,则只需要逗号结尾

import datetime as dt

start_date = dt.datetime.strptime("2017-10-28", '%Y-%m-%d')
stop_date = dt.datetime.strptime("2017-10-30", '%Y-%m-%d')

rng = (stop_date - start_date).days

date_list = [(start_date + dt.timedelta(days=i)).strftime(format='%Y-%m-%d')  
             for i in range(rng+1)]    
last_date_list = [(start_date + dt.timedelta(days=i+365)).strftime(format='%Y-%m-%d')  
                  for i in range(rng+1)]    
first_date_list = [(start_date + dt.timedelta(days=i+360)).strftime(format='%Y-%m-%d')  
                   for i in range(rng+1)]

strSQL = """select distinct CAST(? as date format 'YYYY-MM-DD') as dateId, count(*) 
            from tableA
            where last_date >= cast(? as date format 'YYYY-MM-DD') 
              and first_date >= cast(? as date format 'YYYY-MM-DD')
            group by 1"""

for x, l, f in zip(date_list, last_date_list, first_date_list):
    for row in session.execute(strSQL, (x, l, f)):
        data.append(row)

您正在使用SQLAlchemy吗?在Teradata中,您只需使用别名:
其中last_date>=dateId-365和first_date>=dateId-360
@EricEdLohmar我正在使用PyCharms作为IDE,并使用我正在使用的包编辑上述内容using@dnoeth谢谢你的建议,运行它now@dnoeth你的建议成功了!谢谢你,有趣的是,有时我们认为使用SQLAlchemy的简单解决方案太难了?在Teradata中,你可以简单地使用别名:
其中last\u date>=dateId-365和first\u date>=dateId-360
@EricEdLohmar我正在使用PyCharms作为IDE,并用我正在编写的包编辑上述内容using@dnoeth谢谢你的建议,运行它now@dnoeth你的建议成功了!谢谢,有意思的是,有时候我们想得太难了,无法找到一个简单的解决方案,这肯定行得通,但您可能希望在牢记OP的数据类型的情况下稍微扩展一下您的示例,或者将
datetime
date
timedelta
一起使用,而不是
pandas
,如果
pandas
不是必需的话。这一点很好!相应地进行编辑,OP可以通过查询和参数所需的列表
zip()
。这肯定可以工作,但您可能希望在牢记OP的数据类型的情况下稍微扩展一下您的示例,或者将
datetime
date
timedelta
一起使用,而不是
pandas
,如果
pandas
不是必需的话。这一点很好!相应地进行编辑,OP可以通过查询和参数所需的列表
zip()