python的轻量级数据库对象序列化器。

SPODS的Python项目详细描述


#简单的python对象数据库序列化器(spods)

有时,我们只想保存持久性数据,而不必担心sql注入、事务问题和连接问题。

spod最终有了另一种选择。spods是一个简单、轻量级、易于使用的替代重序列化库。spods还提供了一种访问通用python对象的好方法。

现在,spods甚至通过cgi脚本为您的数据库提供了一个免费的json接口。

将spods.py复制到要在其中使用它的目录。
使用以下方法包括它:

``python
>;````

类。

首先,创建一组"field"对象并将它们存储在"table"中:

``python
>;>fields=[
…字段('id',int,pk=true),
…字段('title',str),
…字段('isbn',int),
…字段('condition',bool)
…]

>;>;book s\u table=table('book',fields)
````

现在是将表链接到数据库并开始创建对象的时候了。为此,只需连接到数据库并调用"create_linked_class(table,connection)"函数:

``python
>;>import sqlite3
>;>con=sqlite3.connect("database.db")
>;```

恭喜!您刚刚在"database.db"中创建了一个数据库,并准备开始在其中存储"book"。如果books表不存在,spods将自动为您创建该表。

您可以运行如下命令:

``python
>;>book=book()
>;>book
{id:1,'title':none,'isbn':none,'condition':none}
````

还可以通过提供现有book对象的id来访问该对象:

`` python
>;>>book.title='笔记本'
>;>book.title
'笔记本'
>;>现有book=book(id=1)
>;>现有book
{id:1,'title':'the notebook','isbn':none,'condition':none}
````


>您也可以通过不指定id来创建新对象:

``python
>;book=book(title='atlas')
>;book.title
"atlas"
````

``使用spods对象

可以对属性使用所有常用的getter和setter方法,例如:

`` python
>;>x.id=7
>;x.id
7
```

>以及类似字典的访问:

``python
>;>x['id']=7
>;>x['id']
7
```

x[字段]=7
>;>;x.id
7
````

x['id']==none
true
```


>或者,等价地:

``python
>;>;x.id=5
>;>;del x.id
>;>;x.id==none
`true
```

只需删除它的主键:

`` python
>;>>del x.id;del x
```

**警告:**不要删除项目的主键后尝试访问该项目。最安全的做法是直接删除对象!

与数据库同步

所有*更新*、*插入*和*删除*将自动与数据库同步。所以别担心!

如果出于某种原因,您需要确保行已同步,则可以手动调用同步函数:

``python
>;>x.read廑sync();从数据库中读取所有值,替换x的本地副本
>;>x.write廑sync();将所有值写入数据库,替换数据库的值
```

要建立一对多关系,请使用以下语法:

``python
>;>;book.has-one(author)
``

一个新列。

现在,您可以使用主键将两个对象关联起来:

``python
>;>book=book(title='harry potter')
>;>author=author(name='j k rowling')
>;1
>;b.作者id=1
````

…通过第一个访问相关对象!

``python
>;>book['author'].name
'j k rowling'
>;>book['author'].id
1
````

**注意:spods的当前版本不支持对关系的属性访问(例如上面示例中的"b.author")。我们正在努力解决这个问题,但目前只支持字典访问(例如"b['author']`)。*


\json api

现在是您想要使用spod的真正原因。spods附带了一个非常简单的自动生成的json api,可以在任何web应用程序中使用。

作者)
>;>result

```

`serve_api`将读取请求访问api的用户的cookies和表单数据,并返回要打印到网页的字符串。

<;!--api将返回"200 ok"、"400 bad request"或"401 unauthorized"响应代码。-->;

json结果包含3个字段:

*`status`,成功时为0,失败时为非零(一般错误为正,授权/权限错误为负)
*`error`,其中包含描述错误的错误消息
*`data`,其中包含受请求影响的对象(字典格式)
*例如`[{"id":2,"title":"正义得到伸张","author_id":1},{"id":3,"title":"地球上最美好的一天","author_id":2}`

api请求的格式如下:

(`{}"括号表示一个参数,`()`方括号表示默认值,`[]`方括号表示可选值:

```
http://www.yourdomain.com/api.py?
obj={<;table_u name>;}
[&;action={(view)add edit delete}]
[&;field>;={<;value>;}]

if action!=添加:
[&fetch={(all)one}


如果fetch=all:
[&;start={(0)number>;=0}]
[&;limit={(<;max_limit>;number>;=0}]
```


所有保留请求值(除了`<;`'s中的值外)都区分大小写-**in**。表名、字段名和字段值区分大小写。

把所有叫做"绿野仙踪"的书改名为"绿野女巫",你可以使用:

```
http://www.yourdomain.com/api.py?
obj=books
&fetch=one
&action=edit
&;*name='the wizard of oz'
&name='the witch of oz'
````

任何一个:

```
&;*name*='绿野仙踪'
&;**name**='绿野仙踪'
&;***name**='绿野仙踪'
```

你可以使用:

```
http://www.yourdomain.com/api.py?
obj=books
&fetch=one
&action=delete
&name='the wizard of oz'

````


obj=books
&fetch=all
&action=view
&author\u id=7
````


obj=books
&author\u id=7
````

注意:
*post数据也被接受,而不仅仅是get data
*事实上,任何cgi数据,一般来说,接受
*忽略未识别的参数


{
数据类型:'json',
数据:{
obj:'books',//我们想要得到的东西
fetch:'all',//我们想要多少
操作:'view',//what we want to do with them

///过滤参数
作者ID:7
},
成功:函数(json){
如果(json.status==0){
/成功!用json做一些事情
$。每个(json.data,函数(i,e){
alert("book"+i+"被称为"+e.title+");
});
}其他{
///错误:应用程序方面出了问题
//查看"error"字段以获取详细信息
alert("error:"+json.error);
}
},
error:function(){
///共有问题:连接问题,等等
alert("出现严重错误!");
}
};

````

我们需要的是一个可定制的接口,它允许各种扩展,并且不会破坏内部。幸运的是,spods在处理定制方面非常出色。


或者,您可能希望编写自己的api函数,这些函数仍然可以访问数据,但可以执行自定义操作。为此,您可以使用**自定义API函数**。

这很简单。首先,定义函数:

`` python
>;>>def credit_checksum(**kw):
…如果"信用卡"不是kw或不是kw["信用卡"].isDigit():
…引发异常("请输入有效的信用卡号码。")
…贷方金额=0
…对于kw中的数字[信用卡]:
…贷方金额+=整数(数字)
…返回{'sum':credit\u sum}

``

(注意函数如何获取*关键字参数`**kw`*,并返回*可序列化的python对象*。这对于json转换很重要。)

`**kw`*参数是CGI输入数据(如URL)。还有一些特殊的值:
*`''u cookie'`是来自用户的cookie对象(如果它不是空的话将被发送回用户)
*`''u classes'`是传递到'serve api()`
*的所有类对象的列表,例如,要检查您的api是否提供"person"对象,您可以检查"if person in kw['''u classes']`
*另一个很好的用法是不通过api提供特定对象,并通过自定义函数强制访问该对象,例如,提供对"user"对象(可能包含密码等)的默认api访问可能会带来安全风险

现在,在注册api时,只需传入函数(以及您希望响应的任何类):

``python
>;result=spods.serve_api(book,author,credit_checksum)
>;

````



obj=信用卡校验和
&credit卡=123492384342
`````

,响应如下:

``json
{"status":0,"error":","data":{"sum":45}
```

##就是这样!

您现在知道了所有关于spod的知识,并将其集成到您的应用程序中。

-)

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

推荐PyPI第三方库


热门话题
java如何将cassandra中的行数据转换为与列相关的嵌套json   java如何使用jcr XPath在jcr:content/@jcr:data中搜索?   java在使用openCV进行安卓开发时如何利用手机的广角镜头   java解析扩展了接口,结束了一个潜在的无限循环   位置服务的@Override方法中存在java Android应用程序错误   java本地线程的用途和需求是什么   具有左右子访问的java节点树遍历   java验证JsonWebToken签名   JUL日志处理程序中的java日志记录   嵌入式Java读取给定时间段的串行数据。   java有没有办法从多个URL获取多个图像?   java线程通过等待intent阻止自己发送intent   java Spring MVC解析多部分内容请求   java JPA/Hibernate静态元模型属性未填充NullPointerException   java格式错误的字符(需要引号,得到I)~正在处理   java为什么PrintWriter对象抛出FileNotFoundException?   java Neo4j未正确保存标签   java IE不加载图像