【发布时间】: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 语句