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

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

问题描述:

如何连接并查询配置了DA的关系数据库ZPsycopgDA在Zope产品中?如何从ZOPE产品直接查询关系数据库/ SQL数据库?

我想使用绑定参数发送我自己的SQL查询,并接收结果优选为一组Result对象。

我不想使用ZSQLMethods,因为我无法事先为每个查询创建一个,而且ZSQLMethods不支持绑定参数。

Zope的数据库适配器(DA)的代码库是一些最古老的代码仍然。在Zope中使用,因此被有些过时当你调用一个Zope DA,你会得到一个数据库连接对象(DB实例),反过来有一个查询方法:

connection = context.idOfZPsycoPGDA() 
connection.query('SELECT * FROM your_table') 

的查询方法是不完全一个Python数据库API标准方法,它接受由\0空字符分隔的多个SQL语句,但如果有多个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 DB API调用。

+0

感谢您的全面回答。我发现connection.query()的结果格式有点奇怪,但是使用Shared.DC.ZRDB.Results.Results(result)得到了一个很好的结果集。 – robcast 2011-03-03 09:42:12

数据库连接器实例应提供接受SQL命令的query()方法。而你通过restrictedTraverse获得通过收购数据库适配器实例的保持(或遍历(“/路径/要/ DA”):

result = context.my_zpyscopgda.query("select * from foo") 

result = context.restrictedTraverse('/path/to/my_zpyscopgda').query("select * from foo")