我正在创建一个简单的应用程序以连接到postgresql数据库,对其进行查询以列出所有表,并查询每个表以输出一些信息。我的代码正在运行,但是我需要修复以下部分的问题。 df_dbtables是我的db模式和表的pandas数据框。
for index, row in df_dbtables.iterrows():
try:
schema_table = row['schema'] + "." + row['table']
cur.execute("SELECT type,stylename FROM %s" % schema_table)
rows = cur.fetchall()
for row in rows:
data.append({"Type" : row[0], "Stylename" : row[1]})
except:
continue
问题1:
我的第一张桌子运转良好。但是第二个表没有类型字段,因此它遇到了这个postgresql错误:psycopg2.errors.UndefinedColumn: column "type" does not exist
然后,代码运行到 except 中,告诉代码继续。问题在于,在第一次运行except之后,我的所有其他表查询也都运行在except中,而忽略了它们具有type和stylename字段。如何正确忽略此错误消息并继续进行下一个迭代?另外,使用try / except输出SQL错误的最佳方法是什么?
问题2: 修复上述问题后,我想知道如何防止这种情况:如果某个字段不存在并遇到SQL错误,它将忽略另一个字段(如果存在),因为它将遇到except。例如:脚本正在查询表X,这是一个没有类型字段的表,当它运行到表中时,它将忽略其样式名称数据。
改进: 我尝试了许多方法来参数化sql查询。我知道我以前使用过的方法对SQL注入非常简单,但是正确的方法只是行不通。
尝试了these methods和others,但无法成功运行它们。
APP 我的下一步是为此代码创建Flask应用。因此,如果您有使用Flask的解决方案,将非常欢迎。
代码已于7月12日更新。但是仍然存在相同的问题:
for index, row in df_dbtables.iterrows():
try:
schema_table = row['schema'] + "." + row['table']
cur = con.cursor()
cur.execute("SELECT type,stylename FROM %s" % schema_table)
for r in rs:
data.append({"Type" : r[0], "Stylename" : r[1]})
#except psycopg2.OperationalError: traceback.print_exc()
except: continue