Python SQL l oop переменные через несколько запросов - PullRequest
1 голос
/ 21 февраля 2020

У меня проблемы с запросом Python Teradata (tdodb c) с циклическим выполнением одного и того же запроса с разными переменными и объединением результатов. Я получил хорошее направление в другом посте и оказался здесь. Моя проблема сейчас заключается в том, что фрейм данных заканчивается только результатами запроса последней переменной в l oop, "state5". К сожалению, у нас есть 5 состояний в своих базах данных с одинаковой схемой. Я могу выполнить тот же запрос, но хочу l oop переменных, чтобы я мог работать для всех 5 состояний и возвращать добавленный запрос. Это было легко с использованием SAS Macro переменных и исправлений, но для EDA и науки о данных нужно довести данные до python.

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)

1 Ответ

0 голосов
/ 23 февраля 2020

Мне удалось наконец заставить это работать, хотя это может быть не самый красноречивый способ сделать это. Я пытался сделать отбрасывание таблиц как одну переменную «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 у меня ограниченное пространство спулинга, что требует создания множества таблиц vol для разделения запросов. Поскольку я потратил много времени, пытаясь решить эту проблему, я добавил ответ, чтобы помочь другим, кто может столкнуться с этим сценарием.

...