2011-03-02 113 views
1

如何連接並查詢配置了DA的關係數據庫ZPsycopgDA在Zope產品中?如何從ZOPE產品直接查詢關係數據庫/ SQL數據庫?

我想使用綁定參數發送我自己的SQL查詢,並接收結果優選爲一組Result對象。

我不想使用ZSQLMethods,因爲我無法事先爲每個查詢創建一個,而且ZSQLMethods不支持綁定參數。

回答

4

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

1

數據庫連接器實例應提供接受SQL命令的query()方法。而你通過restrictedTraverse獲得通過收購數據庫適配器實例的保持(或遍歷(「/路徑/要/ DA」):

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

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