首页 > 解决方案 > Pandas read_sql - 如果表不存在则忽略错误

问题描述

我有一个我已经缩小范围并想要执行的 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/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.")

有任何想法吗?

标签: pythonpandasteradata

解决方案


我想通了,多亏了上面的评论组合。首先,我的 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

推荐阅读