如何从ZOPE产品直接查询关系型/SQL数据库?
我该如何连接到一个已经配置好的关系数据库,比如在Zope产品中使用的ZPsycopgDA?
我想发送自己的SQL查询,并使用绑定参数来接收结果,最好能把结果作为一组Result对象返回。
我不想使用ZSQLMethods,因为我不能为每个查询提前创建一个,而且ZSQLMethods不支持绑定参数。
2 个回答
1
数据库连接器的实例应该提供一个叫做 query() 的方法,这个方法可以接受一个 SQL 命令。你可以通过获取(或者通过限制性遍历路径 '/path/to/da')来拿到数据库适配器的实例:
result = context.my_zpyscopgda.query("select * from foo")
result = context.restrictedTraverse('/path/to/my_zpyscopgda').query("select * from foo")
4
Zope数据库适配器(DA)的代码是Zope中最古老的一部分,所以有点过时。当你调用一个Zope DA时,你会得到一个数据库连接对象(也就是一个DB实例),这个对象里面有一个查询方法:
connection = context.idOfZPsycoPGDA()
connection.query('SELECT * FROM your_table')
这个查询方法并不是标准的Python数据库API方法。它可以接受多个用\0
空字符分隔的SQL语句,但如果有多个语句的话,它就不支持SELECT语句了。
ZPsychoDA的查询方法也可以接受查询参数:
connection.query('SELECT * FROM your_table WHERE id=?', ('yourid',))
更重要的是,ZPsychoDA适配器还让你可以使用一个普通的数据库游标:
c = connection.cursor()
c.query('SELECT * FROM your_table WHERE id=?', ('yourid',))
我的建议是直接使用这个游标,通过它来进行常规的Python数据库API调用。