Python 通过PYODBC迭代SQL查询,并将结果收集到数据库中
我试图对某个日期范围内的所有日期反复运行查询,并将结果收集到每个迭代的数据库中 我建立了一个连接(PYODBC),并创建了一个日期列表,我希望通过SQL查询将其聚合到DF中。我确认日期是一个列表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
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)
,您将得到一个非空数据帧。但警告: