Python資料庫連線池 《DBUtils使用者指南》
DBUtils 使用者指南
版本: | 0.9.2 |
---|---|
發行版: | 09/22/06 |
摘要
DBUtils 是一套允許執行緒化 Python 程式可以安全和有效的訪問資料庫的模組。DBUtils已經作為 Webware for Python 一部分用來結合 PyGreSQL 訪問 PostgreSQL 資料庫,當然他也可以用在其他Python應用程式中來訪問 DB-API 2 相容的資料庫介面。
模組
DBUtils實際上是一個包含兩個子模組的Python包,一個用於連線DB-API 2模組,另一個用於連線典型的PyGreSQL模組。
全域性的DB-API 2變數 | |
---|---|
SteadyDB.py | 用於穩定資料庫連線 |
PooledDB.py | 連線池 |
PersistentDB.py | 維持持續的資料庫連線 |
SimplePooledDB.py | 簡單連線池 |
典型的 PyGreSQL 變數 | |
---|---|
SteadyPg.py | 穩定PyGreSQL連線 |
PooledPg.py | PyGreSQL連線池 |
PersistentPg.py | 維持持續的PyGreSQL連線 |
SimplePooledPg.py | 簡單的PyGreSQL連線池 |
對標準DB-API 2模組的依賴如下圖所示:
對典型的PyGreSQL模組依賴如下圖所示:
安裝
如果你打算在除了Webware之外的程式中使用,推薦安裝為頂層模組:
python setup.py install
如果你只是打算在Webware中使用,則可以按照如下安裝:
python setup.py install --install-lib=/path/to/Webware
替換 /path/to/Webware 為Webware安裝的根路徑。你還需要執行Webware的安裝程式來同時包含DBUtils的文件:
cd path/to/Webware
python install.py
功能
這一節的主要例子面向DB-API 2,但是也適用於典型的PyGreSQL模組。
DBUtils.SimplePooledDB 是一個非常簡單的資料庫連線池實現。他比完善的 PooledDB 模組缺少很多功能。 DBUtils.SimplePooledDB 本質上類似於 MiscUtils.DBPool 這個Webware的組成部分。你可以把它看作一種演示程式。
DBUtils.SteadyDB 是一個模組實現了"強硬"的資料庫連線,基於DB-API 2建立的原始連線。一個"強硬"的連線意味著在連線關閉之後,或者使用次數操作限制時會重新連線。
一個典型的例子是資料庫重啟時,而你的程式仍然在執行並需要訪問資料庫,或者當你的程式連線了一個防火牆後面的遠端資料庫,而防火牆重啟時丟失了狀態時。
一般來說你不需要直接使用 SteadyDB 它只是給接下來的兩個模組提供基本服務, PersistentDB 和 PooledDB 。
DBUtils.PersistentDB 實現了強硬的、執行緒安全的、頑固的資料庫連線,使用DB-API 2模組。如下圖展示了使用 PersistentDB 時的連線層步驟:
當一個執行緒首次開啟一個數據庫連線時,一個連線會開啟並僅供這個執行緒使用。當執行緒關閉連線時,連線仍然持續開啟供這個執行緒下次請求時使用這個已經開啟的連線。連線線上程死亡時自動關閉。
簡單的來說 PersistentDB 嘗試重用資料庫連線來提高執行緒化程式的資料庫訪問效能,並且他確保連線不會被執行緒之間共享。
因此, PersistentDB 可以在底層DB-API模組並非執行緒安全的時候同樣工作的很好,並且他會在其他執行緒改變資料庫會話或者使用多語句事務時同樣避免問題的發生。
DBUtils.PooledDB 實現了一個強硬的、執行緒安全的、有快取的、可複用的資料庫連線,使用任何DB-API 2模組。如下圖展示了使用 PooledDB 時的工作流程:
如圖所示 PooledDB 可以在不同執行緒之間共享開啟的資料庫連線。這在你連線並指定 maxshared 引數,並且底層的DB-API 2介面是執行緒安全才可以,但是你仍然可以使用專用資料庫連線而不線上程之間共享連線。除了共享連線以外,還可以設立一個至少 mincached 的連線池,並且最多允許使用 maxcached 個連線,這可以同時用於專用和共享連線池。當一個執行緒關閉了一個非共享連線,則會返還到空閒連線池中等待下次使用。
如果底層DB-API模組是非執行緒安全的,執行緒鎖會確保使用 PooledDB 是執行緒安全的。所以你並不需要為此擔心,但是你在使用專用連線來改變資料庫會話或執行多命令事務時必須小心。
PersistentDB 和 PooledDB 都是為了重用資料庫連線來提高效能,並保持資料庫的穩定性。
所以選擇何種模組,可以參考上面的解釋。 PersistentDB 將會保持一定數量的連線供頻繁使用。在這種情況下你總是保持固定數量的連線。如果你的程式頻繁的啟動和關閉執行緒,最好使用 PooledDB 。後面將會提到更好的調整,尤其在使用執行緒安全的DB-API 2模組時。
當然,這兩個模組的介面是很相似的,你可以方便的在他們之間轉換,並檢視哪個更好一些。
使用方法
所有模組的使用方法都很相似,但是在初始化 "Pooled" 和 "Persistent" 時還有有些不同,尤其是DB-API和PyGreSQL之間。
這裡只講解 PersistentDB 和更復雜的 PooledDB 模組。其他模組的細節請參與其文件。使用Python直譯器控制檯,你可以顯示 PooledDB 的文件,如下:
help(PooledDB)
為了使用 PersistentDB 你首先需要通過建立 PersistentDB 的例項來設定一個特定資料庫連線的生成器,床底如下引數:
- dbapi: 需要使用的DB-API 2相容的資料庫模組
- maxusage: 一個連線最大允許複用次數(預設為 0 或 False 意味著無限制的重用),當達到限制時,將會重新連線資料庫
- setsession: 一個可選的SQL命令列表可以用於準備會話,如 ["set datestyle to german", ...]
- 其他的,你還可以傳遞用於傳遞給真實的DB-API 2模組的引數,例如主機名、資料庫、使用者名稱、密碼等。
舉個例子,如果你正在使用 pgdb 作為資料庫模組並想要連線本機資料庫 mydb ,允許重用1000次:
import pgdb # import used DB-API 2 module
from PersistentDB import PersistentDB
persist = PersistentDB(pgdb, 1000, database='mydb')
按照如上設定完成了連線生成器之後,你可以按照如下來請求一個連線:
db = persist.connection()
你可以使用這些連線就像使用原始的DB-API 2連線一樣。實際上你得到的是一個通過SteadyDB得到的強硬的連線,基於DB-API 2。
關閉一個強硬的連線使用 db.close() ,這在內部實際上被忽略掉了,並且供下次使用。線上程關閉時,也會自動關閉資料庫連線。你可以改變這個行為通過 persist._closeable 為 True 。
為了使用 PooledDB 模組,你首先需要通過建立 PooledDB 來設定資料庫連線池,傳遞如下引數:
- dbapi: 需要使用的DB-API 2模組
- mincached : 啟動時開啟的空連線數量(預設值 0 意味著開始時不建立連線)
- maxcached: 連線池使用的最多連線數量(預設值 0 代表不限制連線池大小)
- maxshared: 最大允許的共享連線數量(預設值 0 代表所有連線都是專用的)如果達到了最大數量,被請求為共享的連線將會被共享使用。
- maxconnections: 最大允許連線數量(預設值 0 代表不限制)
- blocking: 設定在達到最大數量時的行為(預設值 0 或 False 代表返回一個錯誤;其他代表阻塞直到連線數減少)
- maxusage: 單個連線的最大允許複用次數(預設值 0 或 False 代表不限制的複用)。當達到最大數值時,連線會自動重新連線(關閉和重新開啟)
- setsession: 一個可選的SQL命令列表用於準備每個會話,如 ["set datestyle to german", ...]
- 其他,你可以設定用於傳遞到真正的DB-API 2的引數,例如主機名、資料庫、使用者名稱、密碼等。
舉個例子,如果你正在使用 pgdb 作為DB-API模組,並希望連線池中至少有5個連線到資料庫 mydb
import pgdb # import used DB-API 2 module
from PooledDB import PooledDB
pool = PooledPg(pgdb, 5, database='mydb')
一旦設定好了連線池,你就可以按照如下請求一個連線:
db = pool.connection()
你可以使用這些連線有如原始的DB-API 2一樣。而實際使用的是SteadyDB版本的強硬連線。
請注意連線可以與其他執行緒共享,只要你設定 maxshared 引數為非零,並且DB-API 2模組也允許。如果你想要使用專用連線則使用:
db = pool.connection(0)
如果你不再需要這個連線了,則可以返回給連線池使用 db.close() 。你也可以使用相同的方法獲取另一個連線。
警告: 在一個多執行緒環境,不要使用下面的方法:
pool.connection().cursor().execute(...)
這將會導致過早的釋放連線以供複用,而且如果是非執行緒安全還會出錯。確保連線物件在你的使用過程中是一直存在的,例如:
db = pool.connection()
cur = db.cursor()
cur.execute(...)
res = cur.fetchone()
cur.close() # or del cur
db.close() # or del db
如果你正在 Webware for Python 的 servlets 中使用DBUtils來存取資料庫,你要確保資料庫連線生成器只被應用啟動一次,而不是每個servlet啟動時都建立一個。為了達到這個目的,你可以在模組或類的初始化程式碼中新增這些程式碼,或者使用 __init__.py 中的 contextInitialize() 函式。
目錄 Examples 是DBUtils發行包的一部分,包含了一個使用示例資料庫的Webware的例子,用來跟蹤演講會的出席者(這個例子的主意來自Andrew Kuchling的 "The Python DB-API")。
例子的正文可以通過建立配置檔案 Configs/Database.config 來配置,改變例子 Examples/DBUtilsExample.py 的預設引數。這種方式可以設定一個專用資料庫的使用者名稱和密碼,你也可以選擇底層的資料庫模組。如果設定了 maxcached ,則例子會使用 "Pooled" 模組,否則會使用 "Persistent" 模組。
注意
如果你正在使用流行的ORM SQLObject ,你並不需要使用DBUtiils,因為他已經內含連線池了。 SQLObject 2 (SQL-API) 事實上還從DBUtils這裡借用了連線池分層的程式碼。
未來功能
一些未來會使用的方法:
- 一個連線最大被使用的次數,或一個連線最大活動時間。
- 建立模組 MonitorDB 和 MonitorPg 執行在單獨的執行緒中,監控連線池中各個共享連線的狀態。如果檢測到一個損壞的連線,則會自動恢復這個連線。這在很多網站中是很實用的,因為晚上往往要重啟資料庫伺服器。如果不使用監控執行緒,則使用者要等到第二天早上才可以使用。正是因為如此,檢測損壞的連線並自動恢復是很有用的。使用了監控執行緒之後,間斷時間在晚上,而且很短。監控執行緒同樣可以配置連線生成器的執行緒池,並且確保使用者到達之前完成。
- 可選的日誌,記錄損壞的連線和最大限制。
請將錯誤報告、補丁、回饋直接傳送給作者(使用下面給出的郵件地址)。
作者列表
作者: | |
---|---|
貢獻: | DBUtils收到了如下朋友的幫助和建議 Ian Bicking, Chuck Esterbrook (Webware for Python), Dan Green (DBTools), Jay Love, Michael Palmer, Tom Schwaller, Geoffrey Talvola and Warren Smith (DbConnectionPool). |
版權與許可
Copyright @ 2005-2006 by Christoph Zwerschke. All Rights Reserved.
本文的reStructuredText原始檔:
====================
DBUtils 使用者指南
====================
:版本: 0.9.2
:發行版: 09/22/06
.. contents:: 目錄
摘要
------
DBUtils_ 是一套允許執行緒化 Python_ 程式可以安全和有效的訪問資料庫的模組。DBUtils已經作為 `Webware for Python`_ 一部分用來結合 PyGreSQL_ 訪問 PostgreSQL_ 資料庫,當然他也可以用在其他Python應用程式中來訪問 `DB-API 2`_ 相容的資料庫介面。
模組
------
DBUtils實際上是一個包含兩個子模組的Python包,一個用於連線DB-API 2模組,另一個用於連線典型的PyGreSQL模組。
+-------------------+------------------------------------------+
| 全域性的DB-API 2變數 |
+===================+==========================================+
| SteadyDB.py | 用於穩定資料庫連線 |
+-------------------+------------------------------------------+
| PooledDB.py | 連線池 |
+-------------------+------------------------------------------+
| PersistentDB.py | 維持持續的資料庫連線 |
+-------------------+------------------------------------------+
| SimplePooledDB.py | 簡單連線池 |
+-------------------+------------------------------------------+
+-------------------+------------------------------------------+
| 典型的 PyGreSQL 變數 |
+===================+==========================================+
| SteadyPg.py | 穩定PyGreSQL連線 |
+-------------------+------------------------------------------+
| PooledPg.py | PyGreSQL連線池 |
+-------------------+------------------------------------------+
| PersistentPg.py | 維持持續的PyGreSQL連線 |
+-------------------+------------------------------------------+
| SimplePooledPg.py | 簡單的PyGreSQL連線池 |
+-------------------+------------------------------------------+
對標準DB-API 2模組的依賴如下圖所示:
.. image:: dbdep.gif
對典型的PyGreSQL模組依賴如下圖所示:
.. image:: pgdep.gif
下載
------
你可以從 Webware 的網站下載最新版本:
http://www.webwareforpython.org/downloads/DBUtils/
也可以從Python Package Index來下載:
http://www.python.org/pypi/DBUtils/
安裝
------
安裝為頂層模組
~~~~~~~~~~~~~~~~
如果你打算在除了Webware之外的程式中使用,推薦安裝為頂層模組::
python setup.py install
安裝為Webware的子模組(外掛)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果你只是打算在Webware中使用,則可以按照如下安裝::
python setup.py install --install-lib=/path/to/Webware
替換 ``/path/to/Webware`` 為Webware安裝的根路徑。你還需要執行Webware的安裝程式來同時包含DBUtils的文件::
cd path/to/Webware
python install.py
功能
------
這一節的主要例子面向DB-API 2,但是也適用於典型的PyGreSQL模組。
SimplePooledDB
~~~~~~~~~~~~~~~~
``DBUtils.SimplePooledDB`` 是一個非常簡單的資料庫連線池實現。他比完善的 ``PooledDB`` 模組缺少很多功能。 ``DBUtils.SimplePooledDB`` 本質上類似於 ``MiscUtils.DBPool`` 這個Webware的組成部分。你可以把它看作一種演示程式。
SteadyDB
~~~~~~~~~~
``DBUtils.SteadyDB`` 是一個模組實現了"強硬"的資料庫連線,基於DB-API 2建立的原始連線。一個"強硬"的連線意味著在連線關閉之後,或者使用次數操作限制時會重新連線。
一個典型的例子是資料庫重啟時,而你的程式仍然在執行並需要訪問資料庫,或者當你的程式連線了一個防火牆後面的遠端資料庫,而防火牆重啟時丟失了狀態時。
一般來說你不需要直接使用 ``SteadyDB`` 它只是給接下來的兩個模組提供基本服務, ``PersistentDB`` 和 ``PooledDB`` 。
PersistentDB
~~~~~~~~~~~~~~
``DBUtils.PersistentDB`` 實現了強硬的、執行緒安全的、頑固的資料庫連線,使用DB-API 2模組。如下圖展示了使用 ``PersistentDB`` 時的連線層步驟:
.. image:: persist.gif
當一個執行緒首次開啟一個數據庫連線時,一個連線會開啟並僅供這個執行緒使用。當執行緒關閉連線時,連線仍然持續開啟供這個執行緒下次請求時使用這個已經開啟的連線。連線線上程死亡時自動關閉。
簡單的來說 ``PersistentDB`` 嘗試重用資料庫連線來提高執行緒化程式的資料庫訪問效能,並且他確保連線不會被執行緒之間共享。
因此, ``PersistentDB`` 可以在底層DB-API模組並非執行緒安全的時候同樣工作的很好,並且他會在其他執行緒改變資料庫會話或者使用多語句事務時同樣避免問題的發生。
PooledDB
~~~~~~~~~~
``DBUtils.PooledDB`` 實現了一個強硬的、執行緒安全的、有快取的、可複用的資料庫連線,使用任何DB-API 2模組。如下圖展示了使用 ``PooledDB`` 時的工作流程:
.. image:: pool.gif
如圖所示 ``PooledDB`` 可以在不同執行緒之間共享開啟的資料庫連線。這在你連線並指定 ``maxshared`` 引數,並且底層的DB-API 2介面是執行緒安全才可以,但是你仍然可以使用專用資料庫連線而不線上程之間共享連線。除了共享連線以外,還可以設立一個至少 ``mincached`` 的連線池,並且最多允許使用 ``maxcached`` 個連線,這可以同時用於專用和共享連線池。當一個執行緒關閉了一個非共享連線,則會返還到空閒連線池中等待下次使用。
如果底層DB-API模組是非執行緒安全的,執行緒鎖會確保使用 ``PooledDB`` 是執行緒安全的。所以你並不需要為此擔心,但是你在使用專用連線來改變資料庫會話或執行多命令事務時必須小心。
該選擇哪一個?
~~~~~~~~~~~~~~~~
``PersistentDB`` 和 ``PooledDB`` 都是為了重用資料庫連線來提高效能,並保持資料庫的穩定性。
所以選擇何種模組,可以參考上面的解釋。 ``PersistentDB`` 將會保持一定數量的連線供頻繁使用。在這種情況下你總是保持固定數量的連線。如果你的程式頻繁的啟動和關閉執行緒,最好使用 ``PooledDB`` 。後面將會提到更好的調整,尤其在使用執行緒安全的DB-API 2模組時。
當然,這兩個模組的介面是很相似的,你可以方便的在他們之間轉換,並檢視哪個更好一些。
使用方法
----------
所有模組的使用方法都很相似,但是在初始化 "Pooled" 和 "Persistent" 時還有有些不同,尤其是DB-API和PyGreSQL之間。
這裡只講解 ``PersistentDB`` 和更復雜的 ``PooledDB`` 模組。其他模組的細節請參與其文件。使用Python直譯器控制檯,你可以顯示 ``PooledDB`` 的文件,如下::
help(PooledDB)
PersistentDB
~~~~~~~~~~~~~~
為了使用 ``PersistentDB`` 你首先需要通過建立 ``PersistentDB`` 的例項來設定一個特定資料庫連線的生成器,床底如下引數:
* ``dbapi``: 需要使用的DB-API 2相容的資料庫模組
* ``maxusage``: 一個連線最大允許複用次數(預設為 ``0`` 或 ``False`` 意味著無限制的重用),當達到限制時,將會重新連線資料庫
* ``setsession``: 一個可選的SQL命令列表可以用於準備會話,如 ``["set datestyle to german", ...]``
* 其他的,你還可以傳遞用於傳遞給真實的DB-API 2模組的引數,例如主機名、資料庫、使用者名稱、密碼等。
舉個例子,如果你正在使用 ``pgdb`` 作為資料庫模組並想要連線本機資料庫 ``mydb`` ,允許重用1000次::
import pgdb # import used DB-API 2 module
from PersistentDB import PersistentDB
persist = PersistentDB(pgdb, 1000, database='mydb')
按照如上設定完成了連線生成器之後,你可以按照如下來請求一個連線::
db = persist.connection()
你可以使用這些連線就像使用原始的DB-API 2連線一樣。實際上你得到的是一個通過SteadyDB得到的強硬的連線,基於DB-API 2。
關閉一個強硬的連線使用 ``db.close()`` ,這在內部實際上被忽略掉了,並且供下次使用。線上程關閉時,也會自動關閉資料庫連線。你可以改變這個行為通過 ``persist._closeable`` 為 ``True`` 。
PooledDB
~~~~~~~~~~
為了使用 ``PooledDB`` 模組,你首先需要通過建立 ``PooledDB`` 來設定資料庫連線池,傳遞如下引數:
* ``dbapi``: 需要使用的DB-API 2模組
* ``mincached`` : 啟動時開啟的空連線數量(預設值 ``0`` 意味著開始時不建立連線)
* ``maxcached``: 連線池使用的最多連線數量(預設值 ``0`` 代表不限制連線池大小)
* ``maxshared``: 最大允許的共享連線數量(預設值 ``0`` 代表所有連線都是專用的)如果達到了最大數量,被請求為共享的連線將會被共享使用。
* ``maxconnections``: 最大允許連線數量(預設值 ``0`` 代表不限制)
* ``blocking``: 設定在達到最大數量時的行為(預設值 ``0`` 或 ``False`` 代表返回一個錯誤;其他代表阻塞直到連線數減少)
* ``maxusage``: 單個連線的最大允許複用次數(預設值 ``0`` 或 ``False`` 代表不限制的複用)。當達到最大數值時,連線會自動重新連線(關閉和重新開啟)
* ``setsession``: 一個可選的SQL命令列表用於準備每個會話,如 ``["set datestyle to german", ...]``
* 其他,你可以設定用於傳遞到真正的DB-API 2的引數,例如主機名、資料庫、使用者名稱、密碼等。
舉個例子,如果你正在使用 ``pgdb`` 作為DB-API模組,並希望連線池中至少有5個連線到資料庫 ``mydb`` ::
import pgdb # import used DB-API 2 module
from PooledDB import PooledDB
pool = PooledPg(pgdb, 5, database='mydb')
一旦設定好了連線池,你就可以按照如下請求一個連線::
db = pool.connection()
你可以使用這些連線有如原始的DB-API 2一樣。而實際使用的是SteadyDB版本的強硬連線。
請注意連線可以與其他執行緒共享,只要你設定 ``maxshared`` 引數為非零,並且DB-API 2模組也允許。如果你想要使用專用連線則使用::
db = pool.connection(0)
如果你不再需要這個連線了,則可以返回給連線池使用 ``db.close()`` 。你也可以使用相同的方法獲取另一個連線。
*警告:* 在一個多執行緒環境,不要使用下面的方法::
pool.connection().cursor().execute(...)
這將會導致過早的釋放連線以供複用,而且如果是非執行緒安全還會出錯。確保連線物件在你的使用過程中是一直存在的,例如::
db = pool.connection()
cur = db.cursor()
cur.execute(...)
res = cur.fetchone()
cur.close() # or del cur
db.close() # or del db
在Webware中使用
~~~~~~~~~~~~~~~~~
如果你正在 `Webware for Python`_ 的 servlets 中使用DBUtils來存取資料庫,你要確保資料庫連線生成器只被應用啟動一次,而不是每個servlet啟動時都建立一個。為了達到這個目的,你可以在模組或類的初始化程式碼中新增這些程式碼,或者使用 ``__init__.py`` 中的 ``contextInitialize()`` 函式。
目錄 ``Examples`` 是DBUtils發行包的一部分,包含了一個使用示例資料庫的Webware的例子,用來跟蹤演講會的出席者(這個例子的主意來自Andrew Kuchling的 "`The Python DB-API`_")。
例子的正文可以通過建立配置檔案 ``Configs/Database.config`` 來配置,改變例子
``Examples/DBUtilsExample.py`` 的預設引數。這種方式可以設定一個專用資料庫的使用者名稱和密碼,你也可以選擇底層的資料庫模組。如果設定了 ``maxcached`` ,則例子會使用 "Pooled" 模組,否則會使用 "Persistent" 模組。
注意
------
如果你正在使用流行的ORM SQLObject_ ,你並不需要使用DBUtiils,因為他已經內含連線池了。 `SQLObject 2`_ (SQL-API_) 事實上還從DBUtils這裡借用了連線池分層的程式碼。
未來功能
----------
一些未來會使用的方法:
* 一個連線最大被使用的次數,或一個連線最大活動時間。
* 建立模組 ``MonitorDB`` 和 ``MonitorPg`` 執行在單獨的執行緒中,監控連線池中各個共享連線的狀態。如果檢測到一個損壞的連線,則會自動恢復這個連線。這在很多網站中是很實用的,因為晚上往往要重啟資料庫伺服器。如果不使用監控執行緒,則使用者要等到第二天早上才可以使用。正是因為如此,檢測損壞的連線並自動恢復是很有用的。使用了監控執行緒之後,間斷時間在晚上,而且很短。監控執行緒同樣可以配置連線生成器的執行緒池,並且確保使用者到達之前完成。
* 可選的日誌,記錄損壞的連線和最大限制。
錯誤報告與回饋
----------------
請將錯誤報告、補丁、回饋直接傳送給作者(使用下面給出的郵件地址)。
如果有Webware相關的問題,可以到郵件列表討論 `Webware for Python mailing list`_ 。
連結
------
一些相關軟體的連結:
* DBUtils_
* Python_
* `Webware for Python`_ 框架
* Python `DB-API 2`_
* PostgreSQL_ 資料庫
* PyGreSQL_ 介面
* SQLObject_ 介面
.. _DBUtils: http://www.webwareforpython.org/DBUtils
.. _Python: http://www.python.org
.. _Webware for Python: http://www.webwareforpython.org
.. _Webware for Python mailing list: https://lists.sourceforge.net/lists/listinfo/webware-discuss
.. _DB-API 2: http://www.python.org/dev/peps/pep-0249/
.. _The Python DB-API: http://www.linuxjournal.com/article/2605
.. _PostgresQL: http://www.postgresql.org
.. _PyGreSQL: http://www.pygresql.org
.. _SQLObject: http://www.sqlobject.org
.. _SQLObject 2: http://www.sqlobject.org/2/
.. _SQL-API: http://www.sqlobject.org/sqlapi/
作者列表
----------
:作者: Christoph Zwerschke <[email protected]>
:貢獻: DBUtils收到了如下朋友的幫助和建議
Ian Bicking, Chuck Esterbrook (Webware for Python), Dan Green (DBTools),
Jay Love, Michael Palmer, Tom Schwaller, Geoffrey Talvola
and Warren Smith (DbConnectionPool).
:翻譯: gashero <[email protected]>
版權與許可
------------
Copyright @ 2005-2006 by Christoph Zwerschke.
All Rights Reserved.
DBUtils是一個自由開源軟體,使用 `Open Software License version 2.1`__ 許可。
__ http://www.opensource.org/licenses/osl-2.1.php