我正在实现一个使用数据库后端存储和查询本体的Python本体类。数据库模式是固定的(预先指定的),但我不知道正在使用哪种类型的数据库引擎。但是,我可以依赖于数据库引擎的Python接口使用Python DB-API 2.0 (PEP 249)的事实。一个简单的想法是让用户将符合PEP 249规范的 Connection 对象传递给我的本体构造函数,然后本体将使用各种硬编码 SQL 查询来查询数据库:
<code>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, ))
[...]
</code>
我的问题是,不同的数据库后端允许在查询中支持不同的参数标记,这由后端模块的 paramstyle
属性定义。例如,如果 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)来添加额外的依赖项到项目中。