用于nosql数据库的pythonic接口(支持aws dynamodb)。
Sukimu的Python项目详细描述
NoSQL数据库的pythonic接口(支持dynamodb.)
sukimu提供了一种标准的方法来编写表模式(字段, 验证程序、索引)并执行crud操作。这个框架也 为任何读取操作提供模型扩展和字段选取。
安装
使用pypi:
pip install sukimu
使用git:
pip install git+https://github.com/xethorn/sukimu.git#egg=sukimu
基本用法
从头开始构建新项目时,通常需要一个用户表。 对于这个特定的表,我们有以下规则:
- id:这个唯一的id用于在我们的代码库中标识 用户拥有的内容。
- username:标识用户的字符链。
- password:加密字段。
- full_name:很高兴有,但不是必需的。
- active:帐户是否处于活动状态。
# If you don't have dynamodb set, you can use a local dynamodbfromboto.dynamodb2.layer1importDynamoDBConnectionfromsukimu.dynamodbimportTableDynamo,IndexDynamofromsukimu.fieldsimportFieldfromsukimu.schemaimportSchemaconnection=DynamoDBConnection(host='localhost',port='3333',aws_secret_access_key='foo',aws_access_key_id='bar',is_secure=False)UserModel=Schema(TableDynamo('user',connection),IndexDynamo(Index.PRIMARY,'id',read_capacity=1,write_capacity=1),IndexDynamo(Index.GLOBAL,'username',name='username_index',read_capacity=1,write_capacity=1),id=Field(fields.id),# Login informationusername=Field(validator.username,required=True),password=Field(validator.password,required=True),# User personal informationsfull_name=Field(),active=Field(basetype=boolean))
如果您的表尚未在dynamodb中,您可以通过运行以下命令来创建它:
UserModel.table.create_table()
索引
索引定义哪些键(或一组键)在 桌子。架构将在任何时候对这些索引执行检查 正在创建或更新。
一些示例:
- 如果您有一个用户表,并且需要用户名和电子邮件是唯一的, 这样至少有两个索引。
- 如果有一个会话令牌表,其中包含用户ID和令牌号, 可以有一个由两个键组成的索引:用户id(散列)和令牌 数量(范围)
关于dynamodb索引的说明:dynamodb索引提供了额外的 诸如设置吞吐量(读写)的功能 此外,全局索引不需要组合。 (hash-range)为唯一,若要启用此功能,请设置标志 unique=False。
操作
基础知识
该表以一种可以运行任何操作的方式进行抽象:
- fetch:获取一个或多个条目。
- fetch_one:找到一个符合要求的条目。
- create:添加新条目(sukimu确保索引的唯一性)
- delete:删除条目。
- update:更新条目。
示例:
fromsukimu.operationsimportEqualresp=UserModel.create(id='1a872nd',username='celine')assertrespresp=UserModel.fetch_one(username=Equal('celine'))assertresp.message.get('username')=='celine'# See Validators section for more details.resp=UserModel.update(dict(id='1a872nd'),username='new$username')print(resp.errors)# an error will show on the `$`resp=UserModel.update(dict(id='1a872nd'),username='NewUsername')assertresp.message.get('username')=='newusername'resp=UserModel.fetch_one(id=Equal('1a872nd'))assertresp.message.get('username')=='newusername'
响应格式
Sukimu提供了一个响应信封,旨在帮助消费者 了解返回的数据类型:
- response.message:如果操作成功,则 属性包含数据。
- response.errors:不是一次显示一个错误,而是所有 验证期间检测到的错误填充此属性。
- response.status:类似于http状态码。例如: 获取不存在的数据返回404。
验证器
验证器是对所提供数据的健康检查。
例如:如果有一个字段age,则该字段很可能 有定义的范围(最小和最大)。如果提供的值是 无效,字段验证器抛出异常,由 架构,并作为响应的一部分返回(因此,如果有多个字段 无效,可以通知用户。)
fromschemaimportexceptionsUSERNAME_FORMAT=re.compile('^[a-z\-\d]+$')defusername(value):"""Username validation. Args: value (str): the username. Return: str: All usernames should be lowercase. """ifnotvalueorlen(value)>20:raiseexceptions.FieldException('Username should be less than 20 characters.')ifnotlen(value)>3:raiseexceptions.FieldException('Username should contain more than 3 characters.')ifnotUSERNAME_FORMAT.match(value):raiseexceptions.FieldException('Usernames can only have letters and digits.')returnvalue.lower()
链接验证器是可能的,它发生在模式上:
UserSchema=Schema(...username=Field(validator.username,validator.lowercase,required=True)...)
扩展名
扩展是可以按需获取的附加数据。
扩展的用例与join非常相似。它让你 要从任何源获取其他数据,将附加此数据 你的目标。
字段仅可用于fetch和fetch_one方法。
fromsukimu.operationsimportEqual@UserModel.extension('stats')defstats(item,fields):# You will observe here that fields is an array that contains# 'source.url' and 'user.id'.return{'days':10,'additional_fields':fields}@UserModel.extension('history')defhistory(item,fields):return{'length':20}UserModel.create(id='random',username='michael')resp=UserModel.fetch(username=Equal('michael'),fields=['history','stats.days','stats.source.url','stats.user.id'])print(resp.message)