Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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 通过PYODBC迭代SQL查询,并将结果收集到数据库中_Python_Sql_Pandas_For Loop_Pyodbc - Fatal编程技术网

Python 通过PYODBC迭代SQL查询,并将结果收集到数据库中

Python 通过PYODBC迭代SQL查询,并将结果收集到数据库中,python,sql,pandas,for-loop,pyodbc,Python,Sql,Pandas,For Loop,Pyodbc,我试图对某个日期范围内的所有日期反复运行查询,并将结果收集到每个迭代的数据库中 我建立了一个连接(PYODBC),并创建了一个日期列表,我希望通过SQL查询将其聚合到DF中。我确认日期是一个列表 link = pyodbc.connect( Connection Details ) date = [d.strftime('%Y-%m-%d') for d in pd.date_range('2020-10-01','2020-10-02')] type(date) 我创建了一个空D

我试图对某个日期范围内的所有日期反复运行查询,并将结果收集到每个迭代的数据库中

我建立了一个连接(PYODBC),并创建了一个日期列表,我希望通过SQL查询将其聚合到DF中。我确认日期是一个列表

link = pyodbc.connect(  Connection Details     )

date = [d.strftime('%Y-%m-%d') for d in pd.date_range('2020-10-01','2020-10-02')]
type(date)
我创建了一个空DF来收集SQL查询每次迭代的结果,并检查了结构

empty = pd.DataFrame(columns = ['Date', 'Balance']) 
empty
我已将查询设置为:

sql = """
Select dt as "Date", sum(BAL)/1000 as "Balance"
From sales as bal
where bal.item IN (1,2,3,4)
AND bal.dt =  '{}'
group by "Date";

""".format(day)
我尝试了下面的for循环,希望将每个查询执行的结果聚合到空的df中,但是得到了一个空的df

for day in date:
    a = (pd.read_sql_query(sql, link))
    empty.append(a)

如果问题与SQL设置和/或for循环有关,您有什么想法吗?解决此问题的更好、更有效的方法?

看起来您在生成sql时没有定义day变量。 这可能有助于:

def sql_gen(day):
    sql = """
    Select dt as "Date", sum(BAL)/1000 as "Balance"
    From sales as bal
    where bal.item IN (1,2,3,4)
    AND bal.dt =  '{}'
    group by "Date";

    """.format(day)
    return sql

for day in date:
    a = (pd.read_sql_query(sql_gen(day), link))
    empty.append(a)

通过将
Date
添加为
groupby
列,并将开始日期和结束日期作为过滤参数传递,避免循环并运行单个SQL查询。并使用首选的参数化方法,而不是字符串格式设置,这
pandas.read_sql
不支持:

# PREPARED STATEMENT WITH ? PLACEHOLDERS
sql = """SALES dt AS "Date"
               , SUM(BAL)/1000 AS "Balance"
         FROM sales
         WHERE item IN (1,2,3,4)
           AND dt BETWEEN  ? AND ?
         GROUP BY dt;
      """

# BIND PARAMS TO QUERY RETURN IN SINGLE DATA FRAME
df = pd.read_sql(sql, conn, params=['2020-10-01', '2020-10-02'])

如果您重新分配了每个循环
empty=empty.append(a)
,您将得到一个非空数据帧。但警告: