通过多个查询的Python SQL循环变量

问题描述 投票:0回答:1

我在处理Python Teradata(tdodbc)查询时遇到麻烦,因为该查询会使用不同的变量遍历同一查询并合并结果。我在另一个post中得到了良好的指导,并最终到了这里。我现在的问题是,数据框仅以循环“ state5”中最终变量的查询结果结束。不幸的是,我们在各自的数据库中具有相同模式的5个状态。我可以运行相同的查询,但是想循环变量,以便可以针对所有5种状态运行并返回附加查询。使用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)
python sql pandas for-loop teradata
1个回答
0
投票

我终于可以使它起作用,尽管这可能不是最雄辩的方法。我确实尝试将删除表作为单个变量“ query5”进行处理,但收到DDL错误。一旦我将每个放置表分离到它自己的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环境中,假脱机空间有限,这需要构建许多卷表才能拆分查询。由于我花费了大量时间尝试解决此问题,因此我在答案中添加了帮助其他可能遇到这种情况的人。

© www.soinside.com 2019 - 2024. All rights reserved.