MongoDB的另一个文档映射器(ODM)

yadm的Python项目详细描述


一个文档映射器图片::https://travis-ci.org/zzzsochi/yadm.svg?branch=master
:目标:https://travis ci.org/zzzsochi/yadm

…图片::https://coveralls.io/repos/github/zzzsochi/yadm/badge.svg?branch=master
:目标:https://coveralls.io/github/zzzsochi/yadm?branch=master




它是一个小而简单的odm,可与mongodb一起使用。完整文档:http://yadm.readthedocs.org



----
要求
-






----
快速启动
----



创建模型
=代码::python

from datetime import datetime


import pymongo

from yadm import database
from yadm import document,embeddeddocument
from yadm import fields
from yadm.serialize import to_mongo



class user(document):
_集合"用户"

name=fields.stringfield()
email=fields.emailfield()



class postlogitem(embeddeddocument):
op=fields.stringfield(choices=['created','comment\u added'])
at=fields.datetimefield()
data=fields.mongomapfield()



class post(文档):
r/>log=fields.listfield(fields.embeddeddocumentfield(postlogitem))




class comment(document):
referenceField(post)
text=fields.stringfield()

所有文档都是从类"document"创建的。您可以使用多重继承。

```````````magic attribute设置模型文档的集合名称。




连接到数据库
==代码::python

client=pymongo.mongoclient('mongodb://localhost:27017')
db=database(client,blog')

``database``对象是对``pymongo``或``motor``` database``的包装。



create documents
==br/>

----


代码::python

user=user(name='bill',email='bill@galactic.hero')
db.insert_one(user)


只需将文档插入数据库即可。



post
---

代码::python

post=post()
post.user=user
post.title='small post'
post.body='bla bla bla…'
post.log=[postlogitem(op='created',at=datetime.utcnow())]
db.insert_one(post)

他发布了……代码::python

comment=comment()
comment.user=user
comment.post=post
comment.text="re:bla bla bla bla…"
db.insert_one(comment)
db.update_one(post,push={
"log":to_mongo(postlogtem(op='comment_added',
at=comment.created_at,
data={
"comment":comment.id,
"user":comment.user.id,
})
邮政日志。这是非常有用的情况。




查询
==


代码::python

qs=db(post).find({title':{'$regex':'^s'})
assert qs.count()>;0


1。'DB(POST)``创建"queryset"对象;
2。`` find``method获取原始查询并返回具有更新条件的新的``queryset``对象;
3。`` count``方法查询数据库并返回值。

…代码::python

for post in qs:
assert post.title.startswith('s')

`````````````````````````````````````````````````````````````````````````查询并返回文档生成器。




代码::python

post=db(post)。查找一个({'user':user.id})




get_document
----


get the document by id from primary.

代码::python

user=db.get_document(user,user.id)




----

code::python

user=post.user


get attribute with reference使查询成为引用的集合。警告:N+1问题!
我们在"queryset"对象中有一个缓存,对于一个queryset只获取一个引用的文档。



代码::python

comments=db(comment).find({'post':post.id}).sort(('created_at',1))
在comments.lookup('user'):
print(comment.user.name,comment.text)


此代码使用`$lookup``语句创建聚合查询,以解析引用。



…代码::python

agg=(db.aggregate(comment)
.match(user=user.id)
.group(_id='post',count={'$sum':1})
.sort(count=-1))


agg中的项:
print(item)

或传统的mongodb语法:





agg=db.aggregate(comment,pipeline=[
{'br/>{'match':{'user':user.id},
{{'group':{'id'''post','count':{'$sum'''1}},
{{'sort':{'count':-1}}},
















2.0.5(2019-2019-2.0.5(2019-2019-2.0.0.5(2019-2.02-25)添加``聚合.提示``方法。




>2.0.4(2019-02-20)2.0.4(2019-02-02-20)2.0.4(2019-02-02-20)2.0.1(2018-11-04)2.0.0.1(2018-11-11-04)2.0.0.0.0.0.0.0.0.0.1(2018-br/>






























2.0.0(2018-10-25)
==

*大改写<;https://www.youtube.com/watch?文档逻辑:
-``document.`raw``现在只包含来自pymongo的数据,不包含任何attributenotset``或``not loaded`;
-``document.``已删除已更改的文档:所有更改都反映到``document.`cache`;
-``document.``未加载未加载投影的字段集;
>-``document.``未加载未加载未加载投影的字段集;未加载未加载未加载投影的字段集;
>>
是的-`` document.u new_uu document_uu``对于直接在代码中创建的文档对象,标志是``true`;
-`` document.uu log_uuu``类似于列表的容器,其中包含文档更改日志(目前不稳定的api);
-`` document.u data_uuuuu``被视为已弃用而删除;
-现在不允许将字段设置为类;
-默认值不为惰性并使用文档实例创建;

*更新pymongo(3.7)和motor(2.0)的最低版本:
-添加"database.bulk-write"`;
-添加"database.insert-one"`,`"database.insert-many"和"database.delete-one"`;
-不推荐"database.insert`,`"database.remove`;
-删除"database.bulk"(无需很抱歉,在不推荐使用期内);
-add``queryset.count cuu documents```;
-add``queryset.update'one``和``queryset.update'queryset.update``````;
-add``queryset.delete'one``和``queryset.delete'queryset.delete'mumany`;
-add``queryset.queryset.finu one和更新``````queryset.queryset.queryset.queryset.finu one和更新````````````````````````queryset.queryset.queryset.queryset和更新`````````删除``;
-deprecate``queryset.count`;
-不推荐使用``queryset.update``,``queryset.remove`和``queryset.find`和` modify`;
-删除不推荐使用的``查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询查询'参考文献列表。



1.4.15(2017-12-27)
>

===========


*向``数据库``中添加``投影``参数。获取``文档``和``数据库``重新加载`;
*向``文档``中添加``投影``属性。










================


>


==================



为save``enum.enum``添加'enumfield`;
*为simple state m添加'enumstatefield`'基于``enum.enum``.




1.4.13(2017-10-10-31)1.4.13(2017-10-10-31)1.4.13(2017-10-10-31)1.4.13(2017-10-10-31)1.4.10(2017-07-07)1.4.10(2017-07-07)1.4.10(2017-07-07)1.4.4.10(2017-07-07)1.4.4.10(2017-07-07)1.4.4.10(2017-10-10-31)1.4.10(2017-10)1.4.10






<

*``referencefield.from_mongo``如果找不到文档,请尝试从主
默认情况下。




>1.4.9(2017-07-06)1.4.9(2017-07-07-06)1.4.9(2017-07-07-06)1.4.4(2017-05-17)1.4.4.4.9








=

=

=










========


*增加``TimeDelTaField ``TimeDelTaField ``TimeDelTaField ``TimeDel对于存储持续时间;
*添加"simpleembeddeddocumentfield"用于简单地创建嵌入文档元素

…python



class doc(document)类doc(document)类doc(document):
>embedded=SimpleEmbembembeddedddddocumentfield({
‘i’:integerfield(),
‘s’:stringfield(),








========
=====








<1.4.2(2017-04-09-09-2017-04-09-2017-04-04-09)1.4.4.3(2017-05-)
==================

*用于写操作的附加参数(如"write-concern`)";默认情况下,
*`"create-fake``保存带有"write-concern"多数的文档。



1.4.0(2017-04-05)
==

*删除pymongo 2支持;
*数据库和集合的附加选项;
*添加"database.get-document`;
*添加``typedembeddeddddddadddocumentfield`````typedembeddeddddddaddaddaddadd````;
*``reload``参数的``database.update‘one``必须是关键字
(可能是向后不可写的)。











<1.3.1.1.3.1(2017-02-19)1.3.1(2017-02-19)1.3.1.1(2017-02-21)1.3.1(2017-02-21)


=>





*为"money"添加货币支持:
-全部重写"money"类型。现在已经不是"十进制"的子类了;
-为货币添加存储:``yadm.fields.money.currency.currency.currency.currency.currency存储```;



>1.2.1(2017-01-19)
==========br/>










<1.2.0(2016-12-27)









<1.2.0(2016-12-27)
1.2.0(2016-12-27)===


*删除MongoDB 2.x支持;
*用于更新和删除结果的对象;
*使用冒牌货,而不是冒牌工厂。



1.1.4(2016-08-20)
====


*为"批量"添加一些功能:
-`"批量"。更新一个(文档,**kw)`:批量添加更新一个文档的方法;
-`"批量"。查找(查询)。更新(**kw)`:更新多个文档通过查询;
-``bulk.find(query.upsert().update(**kw)````:upsert document;
-``bulk.find(query.find(query.query).remove(**kw)``````````````bulk.update.update(kw)```````````````````bulk.find```````````````删除文档;





>>

>
>>
-``bulk`` bulk.find`````` u分``方法和``钱。``类方法;




>1.1(2016-04-26)

======



*在queryset级别添加缓存,并将其用于"referencefield";


*在mongo聚合框架支持中添加mongo聚合框架;



*在"queryset"中添加"read"首选项设置;

>
*在"queryset"中添加"exc"参数,如果找不到则查找一个参数,如果找不到则引发异常;如果找不到,则查找一个参数;如果找不到则查找一个参数,则引发异常;如果找不到则查找一个参数,>
*添加``"queryset.remove`;

*deprecate``queryset.with_id`;

*重构环。



1.0(2015-11-14)
==

==

*更改文档结构。不再有坏的"basedocument."属性:
-`basedocument.\uu raw':mongo的原始数据;
-`basedocument.\uu cache':cached objects,casted with fields;
-`basedocument.\uu changed':changed objects.

*更改自定义字段的api:
-不再需要crea每个字段的te字段描述符;
-`只为setattr调用"prepare_value";
-`只为将对象保存到mongo调用"to_mongo";
-`只为从"basedocument"加载值调用"from_mongo";
-删除"field.default"属性。使用"field.get_default"方法;
-添加"field.get_if_loaded"和"field.get_if_attribute_not_set"方法;
-默认情况下,如果未从投影加载字段,则引发"notloadedrorror";

*对"referencefield"的更改:
-如果链接被阻塞,则引发"brokenreference";
-如果文档未保存到数据库,则引发"notbindingtodatabase";

*"field"的"smart_null"关键字;

*文档中的字段必须是实例(而不是类!);

*删除"arrayContainer"和"arrayContainerField";

*删除旧的"mapintKeysField"和"mapobjectidKeysField"。使用新的"mapcustomkeysfield";

*添加"database.update_one"方法对指定文档运行简单的更新查询;

*添加"queryset.distinct";

*"serialize.from_mongo"现在接受"not_loaded"序列,该序列的字段名必须标记为"not loaded"、"parent"和"name";

*`序列化。to_mongo`不要调用'fielddescriptor.\uu set_uuu`;

*伪装者!生成测试对象的子系统;

*测试现在使用pytest;

*等等…

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

推荐PyPI第三方库


热门话题
java读取SSLSocket的最快或最佳方式   JavaGuice向类构造函数注入对象   java类不是抽象的,并且不会覆盖OnClickListener中的抽象方法onClick(视图)   java OpenGL 1.1更改颜色更改以前的颜色?   c#将Java/Android连接到。网络服务   java在节点上生成AES密钥   java Liferay与MarkLogic XDBC数据库集成   java使用静态初始化块来提高性能   java如何在需要不同参数的另一个方法中使用同一类中的方法   音频Java多种声音   Java显式引用转换   java Intellij,如何在maven项目中导入模块   java在什么条件下调用ELResolver的setValue方法?   java在beanshell中计算代码字符串并获取beanshell解释器返回的值   javascript将音频文件上载到服务器并从服务器响应设置图像   编码风格清理java代码,多个else if语句   java是否需要使此变量可变?   java线程未更新GlassPane上的进度条   java关闭调试模式@Vaadin Spring启动应用程序