Pandas read_sql - игнорирование ошибки, если таблица не существует - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть список SQL-скриптов, которые я сузил и хочу выполнить.Данные в списке более или менее соответствуют этому шаблону:

[DROP TABLE ABC ....;, CREATE TABLE ABC ....;, INSERT INTO TABLE ABC .....;,UPDATE TABLE ABC .....;]

Затем они повторяются для следующей таблицы.Все это ограничивается одним списком ниже:

dfToList_P

Проблема, с которой я сталкиваюсь, заключается в том, что когда таблица не существует, я хочу игнорировать ошибку и выполнить инструкцию CREATE TABLE, которая следует за ней.Вот мой код:

def load_test_table(self):
    s = self.connection()
    df = self.retrieve_sql()
    df_P = df.loc[df['STEP_TYPE'] == 'P']
    dfToList_P = df_P['SQL_SCRIPT'].tolist()

    try:
        for sql_script in dfToList_P:
            #print(sql_script)
            pd.read_sql(sql_script, s)
    except teradata.DatabaseError as ex:
        sql_state = ex.args[0]
        if sql_state == 3807:
            print('Tried to DROP table that did not exist:' + sql_script)
        else:
            print('DatabaseError in SQL Script: ' + sql_script)

Я гуглил вокруг и добавил условие try / Кроме того, но я не думаю, что на самом деле что-то делает в этом случае.

Запуск сценарияошибки с:

pandas.io.sql.DatabaseError: Execution failed on sql 'DROP TABLE ABC;': (3807, "[42S02] [Teradata][ODBC Teradata Driver][Teradata Database](-3807)Object 'ABC' does not exist.")

Есть идеи?

1 Ответ

0 голосов
/ 08 февраля 2019

Я понял это, благодаря комбо комментариев выше.Во-первых, мой Try / Except был в неправильном месте, а также я переключился с использования pandas read_sql на обычное выполнение сеанса, и это сработало, как и ожидалось.Если таблица существует, сначала удалите ее, если нет, то создайте ее.

Пересмотренный код ниже:

def load_test_table(self):
    s = self.connection()
    df = self.retrieve_sql()
    df_P = df.loc[df['STEP_TYPE'] == 'P']
    dfToList_P = df_P['SQL_SCRIPT'].tolist()

    for sql_script in dfToList_P:
        try:
            s.execute(sql_script)
        except teradata.DatabaseError as ex:
            sql_state = ex.args[0]
            if sql_state == 3807:
                print('Tried to DROP table that did not exist:' + sql_script)

            else:
                print('DatabaseError in SQL Script: ' + sql_script)
            continue
...