如何从ZOPE产品直接查询关系型/SQL数据库?

1 投票
2 回答
907 浏览
提问于 2025-04-16 12:50

我该如何连接到一个已经配置好的关系数据库,比如在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调用。

撰写回答