gpt4 book ai didi

python - 一般捕获 python DatabaseErrors

转载 作者:行者123 更新时间:2023-11-28 17:23:46 25 4
gpt4 key购买 nike

我有一个数据库模式,可以在各种不同的数据库引擎中实现(假设我将使用 pyodbc 连接到一个 MS Access 数据库,或者我将通过内置的 sqlite3 连接到一个 SQLite 数据库模块作为一个简单的例子)。

我想创建一个工厂函数/方法,它根据某些参数返回适当类型的数据库连接,类似于以下内容:

def createConnection(connType, params):
if connType == 'sqlite':
return sqlite3.connect(params['filename'])
elif connType == 'msaccess':
return pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ={};'.format(params['filename']))
else:
# do something else

现在我有一些查询代码应该适用于任何连接类型(因为无论底层数据库引擎如何,模式都是相同的)但可能会抛出一个我需要捕获的异常:

db = createDatabase(params['dbType'], params)

cursor = db.cursor()

try:
cursor.execute('SELECT A, B, C FROM TABLE')
for row in cursor:
print('{},{},{}'.format(row.A, row.B, row.C))

except DatabaseError as err:
# Do something...

我遇到的问题是来自每个 DB API 2.0 实现的 DatabaseError 类不共享一个公共(public)基类(除了太通用的异常),所以我不知道如何捕捉这些一般异常(exception)。显然我可以做类似下面的事情:

try:
# as before
except sqlite3.DatabaseError as err:
# do something
except pyodbc.DatabaseError as err:
# do something again

...我为每个可能的数据库引擎包含了一个明确的 catch block 。但这对我来说显然是非 pythonic 的。

如何从不同的底层 DB API 2.0 数据库实现中捕获 DatabaseError?

最佳答案

有很多方法:

  1. 使用包罗万象的异常,然后找出它是什么异常。如果它不在您的列表中,请再次提出异常(或您自己的)。请参阅:Python When I catch an exception, how do I get the type, file, and line number?

  2. 也许您想以不同的方式解决问题:您的工厂代码还应该提供要测试的异常。

  3. 我认为(也是我在实践中使用的方法)的一种更简单的方法是为所有数据库连接创建一个类,并为每个特定的数据库类型/语法将其子类化。继承使您可以处理所有特殊性。出于某种原因,我从来不必担心这个问题。

关于python - 一般捕获 python DatabaseErrors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40188916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com