python内存数据库pydblite

Pure-Python engine

最近由于项目开发中发现python informixDB模块对多线程的支持非常不好,当开启两个线程同时连接informix数据库的时候,数据库会报错,显示SQL process正在进行当中,根据python 多线程的机制我们怀疑是连接数据库时,informix将两个线程的cursor识别为同一个,故数据库报错。通过python中multiprocess模块讲所有关于数据库的操作全部改为多进程。

但是这就带来另外一个问题,在之前多线程的情况下,项目中维护着一个Queue,里面存储着若干已经创建好的informix tenant pool 的instance信息,用于客户快速获取可用数据库资源。但是有了多进程的存在,每次客户取一个instance,主进程都需要从Queue中取take一个出来,与此同时take()操作会触发创建一个tenant instance,里边包含一个进程将instance信息再次存储到Queue中。这里会涉及到Queue的进程间通讯的问题。需要将Queue改为multiprocess.queue才能避免数据丢失。这里我想尝试一下用内存数据库来试着简化进程通信的步骤。

    • import class Base from module PyDbLite : from PyDbLite import Base
    • create a database instance, passing it a path in the file system : db = Base(‘dummy‘)
    • for a new database, define the field names : db.create(‘name‘,‘age‘,‘size‘) 
      You don‘t have to define the field types. PyDbLite will accept any value that can be serialized by the cPickle module : strings, Unicode strings, integers, floats, dates and datetimes (instances of the date and datetime classes in the datetime module), user-defined classes, etc
    • if the base exists, open it : db.open()
    • you can pass a parameter "mode" to the create() method, to specify what you want to do if the base already exists in the file system
      • mode = "open" : db.create(‘name‘,‘age‘,‘size‘,mode="open") opens the database and ignores the field definition
      • mode = "override" : db.create(‘name‘,‘age‘,‘size‘,mode="override") erases the existing base and creates a new one with the field definition
      • if mode is not specified and the base already exists, an IOError is raised
    • insert a new record
      • by keywords : db.insert(name=‘homer‘,age=23,size=1.84) 
        If some fields are missing, they are initialized with the value None
      • by positional arguments : db.insert(‘homer‘,23,1.84) 
        The arguments must be provided in the same order as in the create() method
    • save the changes on disk : db.commit() 
      If you don‘t commit the changes, the insertion, deletion and update operations will not be saved on disk. To return to the previous version, just open() it again (this is equivalent to rollback in transactional databases)
    • besides the fields passed to the create() method, an internal field called __id__ is added. It is a integer which is guaranteed to be unique and unchanged for each record in the base, so that it can be used as the record identifier
    • another internal field called __version__ is also managed by the database engine. It is a integer which is set to 0 when the record is created, then incremented by 1 each time the record is updated. This is used to detect concurrency control, for instance in a web application where 2 users select the same record and want to update it at the same time
    • the selection of records uses Python list comprehension syntax : 
      recs = [ r for r in db if 30 > r[‘age‘] >= 18 and r[‘size‘] < 2 ] 
      returns the records in the base where the age is between 18 and 30, and size is below 2 meters. The record is a dictionary, where the key is the field name and value is the field value
    • Python generator expression syntax can also be used : 
      for r in (r for r in db if r[‘name‘] in (‘homer‘,‘marge‘) ):
          do_something_with(r) 
      iterates on the records where the name is one of ‘homer‘ or ‘marge‘
    • to iterate on all the records : 
      for r in db:
          do_something_with(r)
    • a record can be accessed by its identifier : record = db[rec_id] returns the record such that record[‘__id__‘] == rec_id
    • finally, a shortcut can be used for simple selections : db(key1=val1,key2=val2) returns the list of records where the keys take the given value. It is equivalent to [ r for r in db if r["key1"]==val1 and r["key2"]==val2], but much more concise
    • to speed up selections, an index can be created on a field : db.create_index(‘age‘) 
      When an index is created, the database instance has an attribute (here _age : note the heading underscore, to avoid name conflicts with internal names). This attribute is a dictionary-like object, where keys are the values taken by the field, and values are the records whose field values are egal to the key : 
      records = db._age[23] returns the list of records with age == 23 
      If no record has this value, lookup by this value returns an empty list 
      The index supports iteration on the field values, and the keys() method returns all existing values for the field
    • number of records in the base : len(db)
    • to delete a record : db.delete(record) or, if you know the record identifier : del db[rec_id]
    • to delete a list of records : db.delete(list_of_records) 
      list_of_records can be any iterable (list, tuple, set, etc) yielding records
    • to update a record : db.update(record,age=24)
    • to add a new field to an existing base and specify a default value : db.add_field(‘new_field‘[,default=v]). If no default is provided, the field value is None
    • to drop an existing field : db.drop_field(‘name‘)
    • to get the list of fields : db.fields
import pydblite
# 使用内存数据库
pydb = pydblite.Base("address")
# 创建a,b,c三个字段
pydb.create(‘a‘, ‘b‘, ‘c‘)
# 为字段a,b创建索引
pydb.create_index(‘a‘, ‘b‘)
# 插入一条数据

pydb.insert(a=0, b=0, c=1)
pydb.insert(a=1, b=0, c=1)
pydb.insert(a=1, b=0, c=1)
pydb.insert(a=1, b=0, c=1)
pydb.update(records=pydb[1],a=2,c="li")
pydb.delete(pydb[0])
# 查询符合特定要求的数据
results = pydb(a=2)
for i in  results:
    print results[i]
时间: 2024-10-18 10:18:05

python内存数据库pydblite的相关文章

python 内存数据库与远程服务

python 内存数据库与远程服务 需要import的python 内存数据库代码参考下面的链接: http://blog.csdn.net/ubuntu64fan/article/details/50424683 现在的问题: 创建一个内存数据服务,可以供本地或远程用户连接上来,多个用户同时并发读写 这个内存数据库. 解决的步骤有3: (1) 创建服务器(memdb_server.py) (2) 创建客户端(memdb_client.py) (3) 启动服务器,启动客户端 1 服务器代码: #

$Django 路飞之redis内存数据库安装,python中使用,与Memcached,mongodb的区别

一 redis内存数据库安装 二 python中使用 三 redis,Memcached,mongodb的对比 原文地址:https://www.cnblogs.com/3sss-ss-s/p/10177083.html

Python著名的lib和开发框架(均为转载)

第一,https://github.com/vinta/awesome-python Awesome Python A curated list of awesome Python frameworks, libraries, software and resources. Inspired by awesome-php. Awesome Python Admin Panels Algorithms and Design Patterns Anti-spam Asset Management A

Python爬虫(图片)编写过程中遇到的问题

最近我突然对网络爬虫开窍了,真正做起来的时候发现并不算太难,都怪我以前有点懒,不过近两年编写了一些程序,手感积累了一些肯定也是因素,总之,还是惭愧了.好了,说正题,我把这两天做爬虫的过程中遇到的问题总结一下: 需求:做一个爬虫,爬取一个网站上所有的图片(只爬大图,小图标就略过) 思路:1.获取网站入口,这个入口网页上有很多图片集合入口,进入这些图片集合就能看到图片链接了,所以爬取的深度为2,比较简单:2.各个子图片集合内所包含的图片链接有两种形式:一种是绝对图片路径(直接下载即可),另一种的相对

各种 Python 库/模块/工具

1 算法 1.1 字符串处理 re 正则表达式的标准库. StringIO / cStringIO 以读写文件的方式来操作字符串(有点类似于内存文件). cStringIO 是 C 语言实现的,提供高性能:而 StringIO 是 Python 实现的,提供 Unicode 兼容性. chardet chardet 可以猜测任意一段文本的字符集编码.对于编码类型未知的文本,它会很有用. chardet 既可以作为模块来使用,也可以作为命令行工具来使用. 代码示例 import chardet p

Python网络爬虫(一):初步认识网络爬虫

无论你是由于什么原因想做一个网络爬虫,首先做的第一件事情就是要了解它. 在了解网络爬虫之前一定要牢记以下4个要点,这是做网络爬虫的基础: 1.抓取 py的urllib不一定去用,但是要学,如果你还没用过的话.比较好的替代品有requests等第三方更人性化.成熟的库,如果pyer不了解各种库,那就白学了.抓取最基本就是拉网页回来. 如果深入做下去,你会发现要面对不同的网页要求,比如有认证的,不同文件格式.编码处理,各种奇怪的url合规化处理.重复抓取问题.cookies跟随问题.多线程多进程抓取

VoltDB内存数据库的十大FAQ

1. VoltDB是什么? ->VoltDB是一家新型关系型分布式内存数据库管理系统,以解决OLTP为初衷,正在不断增加处理OLAP,提供BI的功能.VoltDB与传统数据库(如DB2,Oracle,MySQL等)最大的不同点就是,VoltDB把全部数据放在内存里,并且可以scale out,运行在一个集群上,集群上的每个节点都可以执行部分数据处理任务. VoltDB官网:http://voltdb.com/ 2. VoltDB支持SQL吗?支持Transaction吗? -> VoltDB支

Python 模块大全

1 算法 1.1 字符串处理 re 正则表达式的标准库. StringIO / cStringIO 以读写文件的方式来操作字符串(有点类似于内存文件). cStringIO 是 C 语言实现的,提供高性能:而 StringIO 是 Python 实现的,提供 Unicode 兼容性. chardet chardet 可以猜测任意一段文本的字符集编码.对于编码类型未知的文本,它会很有用. chardet 既可以作为模块来使用,也可以作为命令行工具来使用. 代码示例 import chardet p

python 常用的标准库及第三方库

标准库Python拥有一个强大的标准库.Python语言的核心只包含数字.字符串.列表.字典.文件等常见类型和函数,而由Python标准库提供了系统管理.网络通信.文本处理.数据库接口.图形系统.XML处理等额外的功能.Python标准库的主要功能有:1.文本处理,包含文本格式化.正则表达式匹配.文本差异计算与合并.Unicode支持,二进制数据处理等功能2.文件处理,包含文件操作.创建临时文件.文件压缩与归档.操作配置文件等功能3.操作系统功能,包含线程与进程支持.IO复用.日期与时间处理.调