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 来分解查询。由于我花了很多时间试图解决这个问题,所以我添加了答案以帮助可能 运行 遇到这种情况的其他人。