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;
*等等…
:目标: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;
*等等…