我正在实现一个 Python 本体类,它使用数据库后端来存储和查询本体。数据库架构是固定的(预先指定),但我不知道使用的是什么类型的数据库引擎。但是,我可以依靠数据库引擎的 Python 接口使用 Python DB-API 2.0 ( PEP 249 ) 的事实。一个简单的想法是让用户将一个符合 PEP 249 的Connection
对象传递给我的本体的构造函数,然后它将使用各种硬编码的 SQL 查询来查询数据库:
class Ontology(object):
def __init__(self, connection):
self.connection = connection
def get_term(self, term_id):
cursor = self.connection.cursor()
query = "SELECT * FROM term WHERE id = %s"
cursor.execute(query, (term_id, ))
[...]
我的问题是允许不同的数据库后端在查询中支持不同的参数标记,由paramstyle
后端模块的属性定义。例如 if paramstyle = 'qmark'
,界面支持问号样式(SELECT * FROM term WHERE id = ?
);paramstyle = 'numeric'
表示数字的位置样式 ( SELECT * FROM term WHERE id = :1
);paramstyle = 'format'
表示 ANSI C 格式字符串样式 ( SELECT * FROM term WHERE id = %s
)。如果我想让我的班级能够处理不同的数据库后端,似乎我必须为所有参数标记样式做好准备。对我来说,这似乎违背了通用 DB API 的全部目的,因为我不能对不同的数据库后端使用相同的参数化查询。
有没有办法解决它,如果有,最好的方法是什么?DB API 没有指定通用转义函数的存在,我可以使用它来清理查询中的值,因此手动转义不是一种选择。我不想通过使用更高级别的抽象(例如 SQLAlchemy)向项目添加额外的依赖项。