Zope使用一個對象數據庫存儲Zope對象。Oracle,Sybase,PostgreSQL等關系數據庫使用一種不同的方法存儲數據。關系數據庫的數據存儲在數據表中,如圖10-1所示:
(圖10-1 關系數據表)
表中的數據以“行”來存儲。表的列組稱為模式。標准查詢語言SQL用來查找、修改關系數據庫中的數據。
Zope不是用這種方法來存儲數據的。Zope的對象數據庫接受彼此有種種關系的許多對象。關系數據存儲於非常簡單的表格之中,不易映射到對象上去。Zope提供了幾種在Zope對象世界中訪問關系數據的途徑,本章下面將詳細介紹“數據庫接口”(Database Adapter)和"SQL方法"。
Zope關系數據庫支持最普通的應用就是操作網絡數據。例如:假定你的人力資源部門管理員工數據,這個數據庫提供了一些工具供管理員生成報表、修改數據。然而,對於員工查看、簡單管理自己的數據卻很困難。如果他的住址變更了,他沒有辦法更改數據庫中自己的地址信息。使用Zope訪問關系數據,你的員工無論在家還是在辦公室,都可以使用任何浏覽器來查看、修改自己的記錄。
使用Zope訪問關系數據庫,你可以利用Zope的所有特性,比如,安全性、動態表達、聯網工作等等。使用Zope可以有機地將數據訪問、數據表達、數據管理融合在一起。
為了在Zope中使用關系數據,必須建立兩種不同的Zope對象:一是“數據庫連接對象”,另一個是“Z SQL方法”。前者告訴Zope如何連接一個關系數據庫;後者使用前者去連接一個數據庫,並描述了對數據庫的操作。本章將進一步討論這兩種對象。
10-1 使用數據庫連接對象
數據庫連接對象用來建立和管理對外部數據庫的連接。在創建SQL方法之前必須建立好數據庫連接對象,所有的Z SQL方法都必須和一個數據庫連接對象關聯,Zope提供了下面幾個數據庫接口(Database Adapter,簡稱AD):
Oracle
Oracle是一個廣泛應用、性能優良的商業關系數據庫。它的Zope商業接口由Digital Creations公司編寫提供。Oracle可以從其網站試用、購買。
Sybase
這是一個流行的商業關系數據庫。它的AD由Digital Creations公司編寫提供。Sybase可以從其網站試用、購買。
ODBC
ODBC是一種由眾多商業、開源數據庫支持的跨平台的數據庫工業標准協議。他的DA由DC公司編寫提供。
PostgreSQL
這個數據庫是開源數據庫的領頭羊。它有多個DA。像ZPoPy,由Zope社區成員Thierry Michel維護。從PostgreSQL的網站可以得到更多關於PostgreSQL的信息。
mysql
MySQL是一個發展迅速的開源關系數據庫。從其網站可以得到更多的信息。它的DA由Zope社區成員Monty Taylor維護。
Interbase
這是Inprise(Borland)公司的一個開源關系數據庫。在該公司的網站上可以得到此數據庫更多的信息。你可能對維護此數據庫一個分支的社區FireBird感興趣。Zope社區成員Bob Tierney在維護該數據庫的Zope接口。
Gadfly
這個關系數據庫是Aaron Waters用Python寫的。它內置在Zope中,用來做演示或處理小批量的數據。它很快,但是不適用於處理大量數據,因為它把所有的數據都讀入內存來處理。可以在Chordate的網站上獲得更多的情況。
除了Gadfly,其它關系數據庫都是Zope的外部擴展。就是說,你的數據庫可以運行在Zope之外的其他機子上。當然,你的Zope要能訪問運行數據庫的主機。安裝、配置關系數據庫超出了本書的范圍。上面提到的關系數據庫都有自己的安裝配置文檔。
因為Gadfly在Zope內運行,你不必為它指定具體的連接信息。其它關系數據庫則要你具體指定如何連接。這種規格成為“連接字符串”,不同數據庫各不相同。例如:圖10-2是PostgreSQL的數據庫連接表單,可以看到此數據庫的連接字符串的格式。
(圖10-2 PostgreSQL 數據庫連接)
為了從Zope中訪問關系數據庫,你必須下載安裝關系數據庫的特定接口。這些接口可以從Zope.org的ProdUCts目錄下載(Gadflyde的接口已經包含在了Zope中)。本章的示例都是使用Gadfly,但處理過程適用於其它關系數據庫。
安裝數據庫接口之後就可以從添加列表中選擇它來創建一個數據庫連接對象了。各個數據庫連接對象都是相似的。從添加列表選擇Z Gadfly Database Connetion會轉入Gadfly數據庫連接對象的添加表單。
選擇Demo數據源,用Gadfly_database_connection作為id,單擊添加按鈕,生成一個Gadfly數據庫連接對象。單擊新建的數據庫連接對象,看到的是它的狀態頁。從本頁可以知道你是否連接到了數據庫(有一個按鈕控制數據庫的連接和斷開)。一般情況下,Zope會自動連接到數據源。某些情況下,你可能想到手工控制數據庫的連接。對Gadfly來說,斷開連接沒有什麽意義,但是對於外部的數據的維護,就有必要手工控制它們的連接。
下一頁是屬性頁,該頁顯示數據源和連接對象的其他一些屬性。當你想把數據源換成另外一個時,就會用到這些屬性。圖10-3顯示了一個屬性頁的情形。
(圖10-3 屬性頁)
在測試頁可以測試你的數據庫連接。在該頁,你可以直接輸入SQL語句操作你的數據庫。該頁用來測試數據庫,同時運行SQL語句(比如創建一個表)。此處不宜輸入過多的SQL語句。SQL語句要放在Z SQL方法中,本章後面將作講解。
讓我們在數據庫中創建一個表以便展示本章的例子。測試頁允許直接輸入SQL語句操作數據庫。你可以在測試頁輸入SQL創建數據表而不必使用Z SQL方法。創建名為employees的表使用如下SQL語句:
CREATE TABLE employees
(
emp_id integer,
first varchar,
last varchar,
salary float
)
單擊提交按鈕運行這條SQL語句。Zope會返回一個驗證頁告訴你什麽SQL在運行和可能的結果。
此處運行的SQL會因你的數據庫不同而各異。數據庫建表的確切語句,請參考數據庫提供商的文檔。
此處的SQL語句將在Gadfly數據庫中新建一個名為employees的表。該表有四列:emp_di,first,last, salary。第一列是員工的id,這是標志員工的唯一號碼。接著的兩列類型是varchar,該類型和字符串類似。salary列的類型是float,即浮點數。不同的數據庫提供不同的數據類型,參考相關文檔查看你的數據庫支持的數據類型。
為了保證員工號是唯一的,需要為表創建一個索引。在測試頁輸入下面的SQL語句:
CREATE UNIQUE INDEX emp_id ON employees
(
emp_id
)
現在你有了一個表並且創建了一個索引,要驗證你的表,轉到浏覽頁。該頁顯示了數據庫的表和它們的模式。在這裡,你可以看到一個employees 表。假如點擊了前邊的“加號”,該表會展開,顯示出四列:emp_id,first,last,salary。如圖10-4所示:
(圖10-4 浏覽數據連接)
當創建多表復雜SQL應用時,這是非常有用的——各表的結構一目了然。當然不是所有的數據庫都支持表的浏覽。
你已經建立了一個數據庫連接對象並且新建了一個表,接下來就可以創建Z SQL方法來操作你的數據了。
10-2節 Z SQL方法
Z SQL方法是Zope中通過數據庫連接對象執行SQL語句的對象。所有的Z SQL方法都必須關聯一個數據庫連接對象。Z SQL方法能查詢數據,也可以修改數據。一個Z SQL方法可以包含多條SQL語句。
下面創建一個名為hire_employee的Z SQL方法用來給employees表添加一條新紀錄。當雇傭新員工時調用這個方法在employees表中插入新員工的記錄。從添加列表中選擇Z SQL方法轉到Z SQL方法的添加表單頁,如圖10-5所示:
(圖10-5 Z SQL方法的添加頁)
同新建其它對象一樣,你要為Z SQL方法指定id和title。另外,需要為Z SQL方法指定一個數據庫連接對象。以hire_employee為id,以上面創建的Gadfly_database_connection為連接對象新建一個Z SQL方法。
接下來你可以給Z SQL方法指定參數。就像腳本一樣,Z SQL方法能接受參數。參數用來構造SQL語句。本例中要指定四個參數:員工號,名字,姓氏和員工的薪水。在參數框中輸入“emp_id first last salary”,參數可以各自寫在一行上,也可以都寫在一行中,中間用空格分開。參數也可以像Python一樣使用默認參數值。例如:emp_id= 100表示emp_id的缺省值是100。
最後的文本框時查詢模板。此處包含的是調用Z SQL時執行的SQL語句。在此處輸入下面的SQL語句:
INSERT INTO employees(emp_id,first,last,salary) VALUES
(
<dtml-sqlvar emp_id type="int">,
<dtml-sqlvar first type="string">,
<dtml-sqlvar last type="string">,
<dtml-sqlvar salary type="float">
)
注意到SQL語句也有DTML語句。這裡的DTML語句是要把參數值插入到要執行的SQL中。因此,假如emp_id=42,first='Bob',last='Uncle',salary=50000.00,這裡的SQL將會是:
INSERT INTO employees (emp_id,first,last,salary) VALUES
(42,'Bob','Uncle',50000.00)
查詢模板和SQL相關的DMTL語句將在後面進一步討論。
新建Z SQL方法有三個按鈕供選擇。添加按鈕將新建Z SQL方法並返回該對象的文件夾。“添加且修改”按鈕將新建Z SQL方法並進入此方法的編輯頁。“添加並測試”按鈕新建Z SQL方法後會自動轉到測試頁,可以在這裡測試新建的Z SQL方法。現在單擊添加按鈕新建一個Z SQL方法。
現在你創建了插入新員工記錄的Z SQL方法,還需要一個Z SQL方法來查詢員工。以list_all_employees為id新建一個Z SQL方法。不需要參數,SQL語句如下:
select * from employees
這條簡單的SQL語句會返回employees表中的所有記錄。現在你有了兩個Z SQL方法:一個用來插入新員工,另一個用來顯示數據庫中所有的員工。讓我們測試一下這兩個方法:先插入一些新員工,然後羅列出他們。進入 hire_employee方法的測試頁,如圖10-6所示:
(圖10-6 hire_employee的測試頁)
在這裡可以看到一個有四個輸入框的表單,對應Z SQL方法的四個參數。Zope根據Z SQL方法的四個參數自動生成了這個表單。hire_employee方法有四個參數,所以Zope生成了一個四個輸入框的表單。輸入一個員工號42,名字Bob,姓氏McBob和薪水50000.00測試這個方法。單擊測試按鈕,你將看到測試的結果。
結果顯示本語句不返回任何對象。這是因為hire_employee方法只是插入記錄,不進行任何選擇,不返回任何記錄。同時你可以看到查詢模板生成的SQL語句。同期望的一樣,sqlvar DTML將四個參數插入了要執行的SQL語句。反復測試這個SQL方法可以將多個員工的信息插入數據庫中。
為了驗證數據是否出入表中,選擇list_all_employees Z SQL方法並進入它的測試頁。測試這個方法不需要輸入,因為它沒有參數。單擊提交查詢按鈕進行測試。
這個方法返回employees表的內容。你加入的新員工都被顯示出來了。Zope為你自動生成了這個表格。接下來我們將演示如何創建自己的Z SQL方法的用戶界面,並將之應用於你的網站。
10-2-1 調用Z SQL方法
查詢關系數據庫將返回記錄的序列。記錄也成為“行”。SQL查詢結果總是記錄集。甚至只有一條記錄,返回的也是一個僅僅包含一條記錄的記錄集。因此Z SQL方法總是返回記錄集(不管記錄集是空還是只有一條記錄)。
一條記錄也稱為‘返回對象’。可以把它想成是一條記錄映射的Zope對象。該對象的屬性對應數據表的模式。
‘記錄對象’和其它的Zope對象最重要的一條區別是:‘記錄對象’不會是長久的Zope對象。記錄對象生命周期很短,一旦它返回了結果就會消亡。下次調用Z SQL方法時將得到新建的記錄對象。
DTML可以引用Z SQL返回的記錄對象來顯示記錄。例如:添加一個名為listEmployees的DTML方法,輸入下面的內容:
<dtml-var standard_Html_header>
<ul>
<dtml-in list_all_employees>
<li><dtml-var emp_id>: <dtml-var last>, <dtml-var first>
makes <dtml-var salary fmt=dollars-and-cents> a year.
</li>
</dtml-in>
</ul>
<dtml-var standard_html_footer>
這個DTML方法調用了Z SQL方法list_all_employees。‘in'語句用來遍歷list_all_employees返回的各個記錄對象。Z SQL方法總是返回記錄對象的列表,所以你總可以從'in'語句中使用記錄對象,除非你對它不感興趣,或SQL方法根本就不返回對象——像 hire_employee一樣。
'in'語句定義了list_all_employees返回記錄對象的表達模板。假如數據表中有三個員工的信息,listEmployees返回的HTML將像下面所示:
<html>
<body>
<ul>
<li>42: Roberts, Bob
makes $50,000 a year.
</li>
<li>101: leCat, Cheeta
makes $100,000 a year.
</li>
<li>99: Junglewoman, Jane
makes $100,001 a year.
</li>
</ul>
</body>
</html>
'in'語句返回了list_all_employees所有記錄對象的HTML表達語句。
下面我們看看如何創建用戶界面錄入數據並傳送這些數據到Z SQL方法中。
10-2-2 給Z SQL方法指派參數
你已經創建了DTML方法listEmployees來調用Z SQL方法list_all_employees顯示員工的信息。現在該看看如何給Z SQL方法hire_employee創建用戶界面。hire_employee方法要四個參數,它的測試頁可以調用這個方法,但是你的web應用程序沒辦法調用測試頁,必須自己創建輸入表單供調用。
Z Search Interface可以為你自動生成輸入表單。在第九章裡你曾用它為一個表單和它的處理生成了搜索表單和返回結果的HTML代碼。Z Search Interface也可以為Z SQL方法生成表單/返回的HTML代碼。
從添加列表中選擇Z Search Interface,指定hire_employee為搜索對象(Searchable Object)。返回頁的id(ReportID)用"hireEmployee",表單頁用"hireEmployeeForm"作Id。單擊添加按鈕。
選擇新建的hireEmployeeForm並進入其view頁,輸入一個新員工的employee_id,名字,姓氏,薪水並提交表單。 Zope返回頁顯示:“這個查詢無返回數據”。這是因為Z Search Interface生成的返回頁要顯示Z SQL方法的返回對象,而hire_employee方法不返回任何對象,它只把員工的信息插入表中。修改DTML方法hireEmployees以便返回更直觀的信息。選擇hireEmployees方法,下面是它的DTML代碼:
<dtml-var standard_html_header>
<dtml-in hire_employee size=50 start=query_start>
<dtml-if sequence-start>
<dtml-if previous-sequence>
<a href="<dtml-var URL><dtml-var sequence-query
>query_start=<dtml-var
previous-sequence-start-number>">
(Previous <dtml-var previous-sequence-size> results)
</a>
</dtml-if previous-sequence>
<table border>
<tr>
</tr>
</dtml-if sequence-start>
<tr>
</tr>
<dtml-if sequence-end>
</table>
<dtml-if next-sequence>
<a href="<dtml-var URL><dtml-var sequence-query
>query_start=<dtml-var
next-sequence-start-number>">
(Next <dtml-var next-sequence-size> results)
</a>
</dtml-if next-sequence>
</dtml-if sequence-end>
<dtml-else>
There was no data matching this <dtml-var title_or_id> query.
</dtml-in>
<dtml-var standard_html_footer>
這段DTML真的很復雜。它用來自動生成序列元素的表格。既然我們不需要這些,可以把他改的簡單些:
<dtml-var standard_html_header>
<dtml-call hire_employee>
<h1>Employee <dtml-var first> <dtml-var last> was Hired!</h1>
<p><a href="listEmployees">List Employees</a></p>
<p><a href="hireEmployeeForm">Back to hiring</a></p>
<dtml-var standard_html_footer>
從hireEmployeeForm添加一個新員工,注意hire_employee方法是被DTML的call方法調用的。這是因為我們知道hire_employee方法沒有返回對象,不必使用'in'語句,簡單實用call方法調用它即可。
現在你已經有了雇傭員工的全部用戶界面。使用Zope的安全策略,可以授權給特定的用戶來使用這些方法。使用Z Search Interface生成的表單/返回界面也可以方便地修改成你期望的樣子。
下一節我們進一步使用SQL進行精確查詢。你已經看到Z SQL方法是如何為你創建的基本的SQL查詢模板。下一節你可以學到如何創建更多的查詢模板。
10-3 動態查詢
ZSQL方法查詢模板中可以包含DTML語句,這些語句在SQL方法被調用時執行,它們可以動態生成SQL供數據庫使用。一些SQL相關的DTML語句用來幫助你構造復雜的SQL查詢。下面小節我們將學習sqlvar、sqltest和sqlgroup語句。
10-3-1 用sqlvar插入參數
插入數據時使用正確的數據類型非常重要。如果你使用字符串“12”而要求的數據類型是整型,數據庫就會報錯。更糟糕的是:不同的數據庫支持的數據類型不盡相同。類型驗證不只是為了避免出錯,而且也是處於安全考慮。假如你有一個查詢語句如下所示:
SELECT * FROM employees WHERE emp_id=<dtml-var emp_id>
這個查詢是不安全的。因為如果有人輸入下面的語句:
"12;DROP TABLE employees"
作為emp_id,執行這條語句表employees將被刪除!為了避免這些問題,就必須進行類型檢查。sqlvar就是用來做這件事的。上面例子安全的寫法應是:
SELECT * FROM employees WHERE emp_id=<dtml-sqlvar emp_id type="int">
sqlvar和DTML的var用法相似。前者會對SQL類型進行檢查,當沒有輸入時默認值設為NULL。sqlvar語句有下面一些屬性:
name
這個屬性和var語句的name屬性一樣。它是一個Zope變量或ZSQL方法的參數名字(譯注:name是sqlvar語句的名字,即它是一個變量;同時它也是ZSQL方法的參數的名字,即一個輸入文本框的名字。前者從後者獲取數據)。該變量或參數的值將插入到SQL查詢模板中。name屬性是必須的,但可以忽略前綴"name="。
type
這個屬性決定如何格式化變量或要插入SQL的參數。type的值有string,int,float,nb(非空字符串)。這個屬性是必須的。
optional
這個屬性用來說明sqlvar可以省略或可以是個空值。假如變量不存在或為空,sqlvar將不會提交這個變量。這個屬性是可選的。(譯注:可以保持測試輸入框為空來理解這個屬性。當salvar語句不包含這個屬性,空輸入會引發異常並報錯;當含有這個屬性時,返回的SQL語句中sqlvar對應的位置不插入的任何東西——本例會返回SQL語法錯誤的提示,因為實際返回的是“SELECT * FROM employees WHERE emp_id=”)
type屬性是sqlvar語句的關鍵屬性。它負責插入變量類型的正確性。查看附錄A獲取sqlvar詳細的情況。處理SQL時你總是應該使用sqlvar替代var來保證SQL的安全。
10-3-2 使用sqltest進行條件測試
許多SQL都要用到條件比較。它們遍歷表中記錄,查找符合輸入條件的記錄。例如:你可能想查詢所有薪水超過一定數目的員工。新建一個名為"employee_paid_more_than"的SQL方法,給定一個參數"salary",查詢模板中輸入:
SELECT * FROM employees WHERE <dtml-sqltest salary op=gt type=float>
單擊添加按鈕並進入其測試頁進行測試。"op"屬性是"gt",即“大於”。ZSQL會返回所有薪水高於你輸入數字的員工。sqltest語句安全地生成對應表列的SQL條件。在salary文本框中輸入10000進行測試。你可以看到提交的是下面的sql語句:
SELECT * FROM employees WHERE salary>10000
sqltest語句根據特定的數據庫做類型檢查後把生成的條件語句插入SQL。sqltest語句有如下屬性:
name
要插入的變量名。(譯注:它同時是輸入框的名稱;如果sqltest語句省略column屬性,它同時還是SQL條件中表字段的名字。)
type
同sqlvar語句一樣。
column
SQL條件中表字段的名字。注意它和name屬性的區別。
multiple
提供多值的標志。這個屬性用來測試字段是否在一個變量集中。例如:假如name是字符串的列表"Bob","Billy",<dtml-sqltest name type="string" multiple>返回如下SQL:
name in ("Bob","Billy")
(譯注:上面的"name"指的是字段的名字。)
optional
同sqlvar語句。
op
比較操作符。它們可以是eq(等於)、gt(大於)、lt(小於)、ge(大於等於)、le(小於等於)、ne(不等於)。
查看附錄A進一步了解sqltest語句。假如你的數據庫提供另外的比較操作(比如'like'),你可以在sqltest中使用它們。假如name是字符串"Mc%",SQL語句
<dtml-sqltest name type="string" op="like">
會返回
name like 'Mc%'
sqltest語句幫助你創建正確的sql查詢。通常,使用sqltest會比直接使用比較語句更靈活,處理不同類型輸入,不同的數據庫時會省去很多麻煩。
10-3-3 使用sqlgroup語句創建復雜查詢
sqlgroup語句用來創建不定參數的SQL查詢。根據參數的多寡,生成的SQL或復雜或簡單。
下面是一個無條件SQL查詢:
SELECT * FROM employees
下面是幾個有條件的SQL查詢:
SELECT * FROM employees WHERE (salary>10000.00)
SELECT * FROM employees WHERE(salary>10000.00 and first in ('Jane','Cheetach','Guido'))
SELECT * FROM employees WHERE(first='Old' and last='McDonald')
上面三個查詢都可以用一個ZSQL方法來實現。使用不同的參數,這個方法會生成特定的sql語句。下面的sql模板就會生成上面的三個查詢:
select * from employees
<dtml-sqlgroup where>
<dtml-sqltest salary op=gt type=float optional>
<dtml-and>
<dtml-sqltest first op=eq type=string multiple optional>
<dtml-and>
<dtml-sqltest last op=eq type=string multiple optional>
</dtml-sqlgroup>
假如sqlgroup語句中有內容,它會提交'WHERE'並且設置查詢的條件;如果沒有參數,'WHERE'是不會插入sql的。
sqlgroup語句中用到了and語句。它同樣會根據情況插入或不插入'and'。'or'語句也一樣。
本例也演示了multiple在sqltest語句中的使用。假如first或last的值是一個列表,正確處理組值的sql會產生。
sqlgroup語句可以嵌套使用:
select * from employees
<dtml-sqlgroup where>
<dtml-sqlgroup>
<dtml-sqltest first op=like type=string>
<dtml-and>
<dtml-sqltest last op=like type=string>
</dtml-sqlgroup>
<dtml-or>
<dtml-sqltest salary op=gt type=float>
</dtml-sqlgroup>
給定一些參數,這個SQL模板返回下面的SQL:
select * from employees
where
( (first like 'A%'
and
last like 'Smith'
)
or
salary > 20000.0
)
使用sqlgroup語句可以構造復雜查詢。為了簡化sql語句,你可以不使用sqlgroup語句。但是,當你創建了若干不同卻又有相似的ZSQL方法時,你可以試試使用sqlgroup語句來合並它們。
10-4 高級話題
目前為止,你已經看到了如何連接一個關系數據庫,查詢數據,操作數據庫,創建用戶界面。這些都是訪問Zope關系數據庫的基本知識。
在下面的幾節當中你可以看到如何更緊密地結合Zope以及如何增強它們的性能。首先看一下如何直接指定參數和使用‘獲取’ (acquisition)技術來給ZSQL方法傳遞參數。接著可以看到如何直接通過URL‘尋找’(traversal)調用ZSQL方法。之後是如何給記錄對象綁定類。最後看到的是使用緩沖增強功效以及Zope的事務處理。
10-4-1 直接指定參數調用ZSQL方法
如果從DTML中調用ZSQL方法不明確指定參數,系統會自動把參數傳遞給ZSQL方法。到現在為止,我們使用的就是這種方法。通過搜索表單查詢數據庫時這種方法工作的很好,但是有些時候需要手工或通過腳本來查詢數據。從DTML或Python腳本中可以直接指定參數調用ZSQL方法。例如: ZSQL方法employee_by_id如下:
SELECT * FROM employees WHERE
調用它使用下面的DTML方法:
,
's employee id is .
first> makes per year.
employee_by_id方法只返回一條記錄,in語句只循環一次。本例像一樣調用ZSQL方法,並傳遞給它一個參數emp_id,就像Python腳本一樣:
## Script (Python) "join_name"
##parameters=id
##
for result in context.employee_by_id(emp_id=id):
return result.last + ', ' + result.first
這段腳本通過參數id將參數傳遞給employee_by_id的emp_id參數,之後它‘遍歷’這個單記錄的列表,將姓和名用逗號分開後返回。
通過直接傳遞參數給ZSQL方法可以對關系數據庫進行更多的控制。從DTML和Python中直接指定參數調用ZSQL方法就像調用其它Zope方法一樣。
SELECT * FROM employees WHERE
調用它使用下面的DTML方法:
,
's employee id is .
first> makes per year.
employee_by_id方法只返回一條記錄,in語句只循環一次。本例像一樣調用ZSQL方法,並傳遞給它一個參數emp_id,就像Python腳本一樣:
## Script (Python) "join_name"
##parameters=id
##
for result in context.employee_by_id(emp_id=id):
return result.last + ', ' + result.first
這段腳本通過參數id將參數傳遞給employee_by_id的emp_id參數,之後它‘遍歷’這個單記錄的列表,將姓和名用逗號分開後返回。
通過直接傳遞參數給ZSQL方法可以對關系數據庫進行更多的控制。從DTML和Python中直接指定參數調用ZSQL方法就像調用其它Zope方法一樣。