【发布时间】:2010-09-30 08:51:28
【问题描述】:
我正在实现一个 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 属性定义。比如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)为项目添加额外的依赖项。
【问题讨论】:
标签: python sql python-db-api