Differences between revisions 4 and 5
Revision 4 as of 2005-02-20 07:44:49
Size: 1128
Editor: ZoomQuiet
Comment: 建议使用 WikiName 规范的页面名称
Revision 5 as of 2005-02-20 08:03:27
Size: 3366
Editor: hoxide
Comment:
Deletions are marked like this. Additions are marked like this.
Line 23: Line 23:
 * ZODB的数据存储形式, 是多选的, 可以是普通文件(FileStorage), DB4和ZEO连接.
 * Python类通过继承Persistent可以变为ZODB化的.
 * ZODB是基于"事务"的.
 * ZODB的数据存储形式, 是多选的, 可以是普通文件(FileStorage), DB4和ZEO连接
 * Python类通过继承Persistent可以变为ZODB化的
 * ZODB是基于"事务"的
 * ZODB的逻辑结构是树状结构
Line 27: Line 29:
 先来看一个例子, 这个例子是可以运行的, 源于《ZODB/ZEO Programming Guide》
{{{
!python
from ZODB import FileStorage, DB
import ZODB
from Persistence import Persistent
from BTrees.OOBTree import OOBTree
Line 28: Line 37:
= 反馈 =
 * 好也!又是一个耐不住的行者!不过建议使用 WikiName 规范的页面名称-- ZoomQuiet
class User(Persistent):
    pass

def test1():
    storage = FileStorage.FileStorage("test-filestorage.fs")
    db = DB(storage)
    conn = db.open()
    dbroot = conn.root()
    # Ensure that a 'userdb' key is present
    # in the root
    if not dbroot.has_key('userdb'):
        dbroot['userdb'] = OOBTree()
    userdb = dbroot['userdb']
    # Create new User instance
    newuser = User()
    # Add whatever attributes you want to track
    newuser.id = 'amk'
    newuser.first_name = 'Andrew'
    newuser.last_name = 'Kuchling'
    # Add object to the BTree, keyed on the ID
    userdb[newuser.id] = newuser
    # Commit the change
    get_transaction().commit()
    conn.close()
    storage.close()

def test2():
    storage = FileStorage.FileStorage("test-filestorage.fs")
    db = DB(storage)
    conn = db.open()
    dbroot = conn.root()
    it = [dbroot]
    for t in it:
        for k, v in t.items():
            if isinstance(v, OOBTree):
                print k, ':'
                it.append(v)
            elif isinstance(v, User):
                print 'Key:', k
                print 'ID:', v.id
                print 'first_name:', v.first_name
                print 'last_name:', v.last_name
    
if __name__ == "__main__":
    test1()
    test2()
}}}

 test1向数据库写数据, test2从数据库读数据.

=== 逐步分解 ===
 * 连接数据库, 这个例子中使用普通文本:
{{{
from ZODB import FileStorage, DB
storage = FileStorage.FileStorage('/tmp/test-filestorage.fs')
db = DB(storage)
conn = db.open()
}}}

 * 建一个ZODB化的类User
{{{
!python
import ZODB
from Persistence import Persistent

class User(Persistent):
    pass
}}}

 * 获取数据库的根,
 若没有userdb添加一个userdb实例
{{{
!python
dbroot = conn.root()
# Ensure that a 'userdb' key is present
# in the root
if not dbroot.has_key('userdb'):
   from BTrees.OOBTree import OOBTree
   dbroot[’userdb’] = OOBTree()
userdb = dbroot[’userdb’]
}}}

dbroot和userdb都是OOBTree的实例

ZODB 讨论中

::-- hoxide [DateTime(2005-02-20T06:24:40Z)] TableOfContents

ZODB

简述

起因

  • 公元2005年2月19日会课中, limodou提到用ZODB来完成知识存储的想法. 他挖坑,偶就先跳进去了.

学习笔记

  • 《ZODB/ZEO Programming Guide》一共才25页, 花了3小时看完, 先写点不算翻译也不算感想的东西吧.

ZODB的安装

  • windows版本从[http://zope.org/Products/ZODB3.2]下载.

  • BSD下直接在ports/databases/zodb3中安装
  • ZODB主要包括了ZODB,ZEO,BTREE等几个重要都包, 他们可以独立于ZOPE运行的, 其实ZODB是ZOPE的地层, 整个ZOPE就架在ZODB上.

基本概念

  • ZODB虽然是OODB, 但是任何有一些和关系数据库类似的概念
  • ZODB的数据存储形式, 是多选的, 可以是普通文件(FileStorage), DB4和ZEO连接

  • Python类通过继承Persistent可以变为ZODB化的
  • ZODB是基于"事务"的
  • ZODB的逻辑结构是树状结构

例子

  • 先来看一个例子, 这个例子是可以运行的, 源于《ZODB/ZEO Programming Guide》

!python
from ZODB import FileStorage, DB
import ZODB
from Persistence import Persistent
from BTrees.OOBTree import OOBTree

class User(Persistent):
    pass

def test1():
    storage = FileStorage.FileStorage("test-filestorage.fs")
    db = DB(storage)
    conn = db.open()
    dbroot = conn.root()
    # Ensure that a 'userdb' key is present
    # in the root
    if not dbroot.has_key('userdb'):
        dbroot['userdb'] = OOBTree()
    userdb = dbroot['userdb']
    # Create new User instance
    newuser = User()
    # Add whatever attributes you want to track
    newuser.id = 'amk'
    newuser.first_name = 'Andrew'
    newuser.last_name = 'Kuchling'
    # Add object to the BTree, keyed on the ID
    userdb[newuser.id] = newuser
    # Commit the change
    get_transaction().commit()
    conn.close()
    storage.close()

def test2():
    storage = FileStorage.FileStorage("test-filestorage.fs")
    db = DB(storage)
    conn = db.open()
    dbroot = conn.root()
    it = [dbroot]
    for t in it:
        for k, v in t.items():
            if isinstance(v, OOBTree):
                print k, ':'
                it.append(v)
            elif isinstance(v, User):
                print 'Key:', k
                print 'ID:', v.id
                print 'first_name:', v.first_name
                print 'last_name:', v.last_name
    
if __name__ == "__main__":
    test1()
    test2()
  • test1向数据库写数据, test2从数据库读数据.

逐步分解

  • 连接数据库, 这个例子中使用普通文本:

from ZODB import FileStorage, DB
storage = FileStorage.FileStorage('/tmp/test-filestorage.fs')
db = DB(storage)
conn = db.open()
  • 建一个ZODB化的类User

!python
import ZODB
from Persistence import Persistent

class User(Persistent):
    pass
  • 获取数据库的根, 若没有userdb添加一个userdb实例

!python
dbroot = conn.root()
# Ensure that a 'userdb' key is present
# in the root
if not dbroot.has_key('userdb'):
   from BTrees.OOBTree import OOBTree
   dbroot[’userdb’] = OOBTree()
userdb = dbroot[’userdb’]

dbroot和userdb都是OOBTree的实例

ZODB笔记 (last edited 2009-12-25 07:12:51 by localhost)