【问题标题】:Pandas read_sql - ignoring error if table does not existPandas read_sql - 如果表不存在则忽略错误
【发布时间】:2019-07-02 03:27:55
【问题描述】:

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

有什么想法吗?

【问题讨论】:

  • 我不明白你为什么要在pd.read_sql() 上丢表。为什么要为此使用熊猫?
  • 在您的异常中添加一个继续行。遇到异常后,脚本不知道下一步该做什么
  • @EdekiOkoh 那行不通。整个 for 循环失败。异常处理程序应 for 循环
  • 另外,我不明白在表不存在的情况下尝试删除表是如何合乎逻辑的。
  • @roganjosh 抱歉,如果我不清楚,如果表不存在,我只想转到 Create Table 语句。如果表确实存在,我希望执行 DROP 语句,然后执行 Create Table 语句

标签: python pandas teradata


【解决方案1】:

感谢上面的 cmets 组合,我想通了。首先,我的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2017-02-15
    • 2012-03-28
    • 2022-01-18
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多