Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

建立和断开与 ZODB 的连接

$
0
0
连接到 ZODB 的标准方法涉及到创建四个对象:存储数据库数据的方法、围绕存储并为存储提供实际数据库行为“db”包装、启动与该数据库的特定会话的“connection”对象,最后是允许我们访问包含在数据库中的对象层次结构的根的“dbroot”对象。以下所有示例都需要将这同一个代码片段放在 Python 文件中的示例代码前面,以便正确地打开和关闭 ZODB 实例。

myzodb.py

        from ZODB import FileStorage, DB    
 	import transaction
class MyZODB(object): def __init__(self, path): self.storage = FileStorage.FileStorage(path) self.db = DB(self.storage) self.connection = self.db.open() self.dbroot = self.connection.root() def close(self): self.connection.close() self.db.close() self.storage.close()


存储简单 Python 数据

store_simple.py

             
         
        from myzodb import MyZODB, transaction
        db = MyZODB('./Data.fs')
        dbroot = db.dbroot
        dbroot['a_number'] = 3
        dbroot['a_string'] = 'Gift'
        dbroot['a_list'] = [1, 2, 3, 5, 7, 12]
        dbroot['a_dictionary'] = { 1918: 'Red Sox', 1919: 'Reds' }
        dbroot['deeply_nested'] = {
          1918: [ ('Red Sox', 4), ('Cubs', 2) ],
          1919: [ ('Reds', 5), ('White Sox', 3) ],
          }
        transaction.commit()
        db.close()

获取简单数据
                
fetch_simple.py 

        from myzodb import MyZODB
        db = MyZODB('./Data.fs')
        dbroot = db.dbroot
        for key in dbroot.keys():
            print key + ':', dbroot[key]
        db.close()

当您将某个键设置为新值时,ZODB 始终能够了解这一点。因此,对上面的数据库进行的类似如下的更改将会自动被检测和持久化:
dbroot['a_string'] = 'Something Else' transaction.commit() db.close()
您需要显式地将对列表或字典的更改告诉 ZODB,因为 ZODB 无法了解所做的更改。这是持久性框架中的一个规定的可变性和参与功能。下面的代码不会导致随后的“fetch_simple.py”运行将会看到的更改:

        a_dictionary = dbroot['a_dictionary']
        a_dictionary[1920] = 'Indians'
        transaction.commit()
        db.close()

如果打算修改——而不是完全替换——类似如此的复杂对象,您需要设置数据库根的属性 _p_changed,以通知它需要重新存储其下的属性:

        a_dictionary = dbroot['a_dictionary']
        a_dictionary[1920] = 'Indians'
        db._p_changed = 1
        transaction.commit()
        db.close() 
      

删除

       del dbroot['a_number']
       transaction.commit()
       db.close()  
      


作者:forgetbook 发表于2013-4-22 12:24:19 原文链接
阅读:7 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>