Python SQL 通过多个查询循环变量
Python SQL loop variables through multiple queries
我在使用 Python Teradata (tdodbc) 查询时遇到问题,该查询循环遍历具有不同变量的同一查询并合并结果。我在另一个 中得到了很好的指导,并最终来到这里。我现在的问题是数据框只以循环中最终变量的查询结果结束,"state5"。不幸的是,我们有 5 个州,每个州都在他们自己的数据库中,具有相同的模式。我可以 运行 相同的查询,但想循环变量,这样我就可以 运行 所有 5 个状态和 return 附加查询。这很容易使用 SAS 宏变量和修补,但需要将数据带到 python 用于 EDA 和数据科学。
from teradata import tdodbc
udaExec = td.UdaExec(appConfigFile="udaexec.ini")
with udaExec.connect("${dataSourceName}") as session:
state_dataframes = []
STATES = ["state1", "state2", "state3", "state4", "state5"]
for state in STATES:
query1 = """database my_db_{};"""
query2 = """
select top 10
'{}' as state
,a.*
from table_a
"""
session.execute(query1.format(state))
session.execute(query2.format(state))
state_dataframes.append(pd.read_sql(query2, session))
all_states_df = pd.concat(state_dataframes)
虽然这可能不是最 eloquent 的方式,但我终于能够让它发挥作用。我确实尝试将 drop tables 作为单个变量 "query5" 执行,但收到 DDL 错误。一旦我将每一滴 table 分成它自己的 session.execute,它就起作用了。
udaExec = td.UdaExec(appConfigFile="udaexec.ini")
with udaExec.connect("${dataSourceName}") as session:
state_dataframes = []
STATES = ["state1", "state2", "state3", "state4", "state5"]
for state in STATES:
query1 = """database my_db_{};"""
query2 = """
create set volatile table v_table
,no fallback, no before journal, no after journal as
(
select top 10
'{}' as state
,t.*
from table t
)
with data
primary index (dw_key)
on commit preserve rows;
"""
query3 = """
create set volatile table v_table_2
,no fallback, no before journal, no after journal as
(
select t.*
from v_table t
)
with data
primary index (dw_key)
on commit preserve rows;
"""
query4 = """
select t.*
from v_table_2 t
"""
session.execute(query1.format(state))
session.execute(query2.format(state))
session.execute(query3)
state_dataframes.append(pd.read_sql(query4, session))
session.execute("DROP TABLE v_table")
session.execute("DROP TABLE v_table_2")
all_states_df = pd.concat(state_dataframes)
为清楚起见进行编辑:更正问题中的查询只需要适当的缩进。在我的 Teradata 环境中,我的 spool space 有限,这需要构建许多 vol table 来分解查询。由于我花了很多时间试图解决这个问题,所以我添加了答案以帮助可能 运行 遇到这种情况的其他人。
我在使用 Python Teradata (tdodbc) 查询时遇到问题,该查询循环遍历具有不同变量的同一查询并合并结果。我在另一个
from teradata import tdodbc
udaExec = td.UdaExec(appConfigFile="udaexec.ini")
with udaExec.connect("${dataSourceName}") as session:
state_dataframes = []
STATES = ["state1", "state2", "state3", "state4", "state5"]
for state in STATES:
query1 = """database my_db_{};"""
query2 = """
select top 10
'{}' as state
,a.*
from table_a
"""
session.execute(query1.format(state))
session.execute(query2.format(state))
state_dataframes.append(pd.read_sql(query2, session))
all_states_df = pd.concat(state_dataframes)
虽然这可能不是最 eloquent 的方式,但我终于能够让它发挥作用。我确实尝试将 drop tables 作为单个变量 "query5" 执行,但收到 DDL 错误。一旦我将每一滴 table 分成它自己的 session.execute,它就起作用了。
udaExec = td.UdaExec(appConfigFile="udaexec.ini")
with udaExec.connect("${dataSourceName}") as session:
state_dataframes = []
STATES = ["state1", "state2", "state3", "state4", "state5"]
for state in STATES:
query1 = """database my_db_{};"""
query2 = """
create set volatile table v_table
,no fallback, no before journal, no after journal as
(
select top 10
'{}' as state
,t.*
from table t
)
with data
primary index (dw_key)
on commit preserve rows;
"""
query3 = """
create set volatile table v_table_2
,no fallback, no before journal, no after journal as
(
select t.*
from v_table t
)
with data
primary index (dw_key)
on commit preserve rows;
"""
query4 = """
select t.*
from v_table_2 t
"""
session.execute(query1.format(state))
session.execute(query2.format(state))
session.execute(query3)
state_dataframes.append(pd.read_sql(query4, session))
session.execute("DROP TABLE v_table")
session.execute("DROP TABLE v_table_2")
all_states_df = pd.concat(state_dataframes)
为清楚起见进行编辑:更正问题中的查询只需要适当的缩进。在我的 Teradata 环境中,我的 spool space 有限,这需要构建许多 vol table 来分解查询。由于我花了很多时间试图解决这个问题,所以我添加了答案以帮助可能 运行 遇到这种情况的其他人。