用于nosql数据库的pythonic接口(支持aws dynamodb)。

Sukimu的Python项目详细描述


LicenseBuild status

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非常相似。它让你 要从任何源获取其他数据,将附加此数据 你的目标。

字段仅可用于fetchfetch_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)

作者

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
我可以用C++代码使用java代码吗?   java使用JSR303在派生类中提供更具体的约束   java在这个查找唯一路径数算法中我做错了什么?   java如何为2个不同的服务提供商使用2个不同的SSL证书?   java在Gridview上绘制文本   java使用连接for循环构建字符串名   java StringBuilder拆分无法处理某些文件   java事件关注EditText   Java Web Start“找不到URL的缓存资源”   java程序从命令行运行的速度比在Eclipse中慢   java为什么HttpServletRequest会截断#字符上的url输入?   java自定义折叠工具栏平滑标题大小调整   使用Mockito对安卓 java中调用另一个静态函数的函数进行单元测试   http在java客户机中使用cachecontrol头   java如何使用。是否使用Delimiter从输入文件中排除标点符号和数字?   使用上下文作为参数/参数的java   java更有效地从Jar中提取文件   java为多个JButton提供相同的actionListener