熊猫read_sql-如果表不存在则忽略错误

时间:2019-02-07 22:07:25

标签: python pandas teradata

我列出了要缩小范围并要执行的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)

我在Google周围搜索并添加了try / except条件,但我认为在这种情况下实际上并没有做任何事情。

使用以下命令运行脚本错误:

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 :(得分:1)

我想通了,这要感谢上面的评论。首先,我的Try / Except位置不正确,而且我从使用pandas read_sql切换到仅使用常规会话execute,并且按预期工作。如果存在表,请先将其删除,否则请创建它。

下面的修订代码:

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