我列出了要缩小范围并要执行的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.")
有什么想法吗?
答案 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