python - 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.")
有任何想法吗?
解决方案
我想通了,多亏了上面的评论组合。首先,我的 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
推荐阅读
- visual-studio-code - VS Code - 调试引用项目 (.NET Core)
- amazon-web-services - 为什么 Kubernetes (AWS EKS) 将所有工作人员注册到负载均衡器?
- python - 多个树列表并保存在 pandas DataFrame 中
- r - 将具有部分空值的嵌套列表转换为 R data.frame
- c# - MongoDB 表达式 System.InvalidOperationException:“不支持。”
- python-2.7 - boto3 中不存在 VPC Id
- python - Seaborn Factorplot 在实际图下方生成额外的空图
- c# - 循环遍历 C# 中的字典
- pandas - 我的 .loc 有多个条件一直在运行...帮我降落飞机
- swift - 如何防止 Sprite 节点相互推挤?