代码之家  ›  专栏  ›  技术社区  ›  JD2775

Pandas read_sql-如果表不存在,则忽略错误

  •  0
  • JD2775  · 技术社区  · 7 年前

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

    然后它为下一个表重复它自己。所有这些仅限于以下一个列表:

    dfToList_P
    

    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 回复  |  直到 7 年前
        1
  •  1
  •   JD2775    7 年前

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