简单的pymongo“无模式”对象包装器
mogo的Python项目详细描述
mogo
===
这个库是一个简单的"无模式"对象包装器,位于
pymongo库(http://github.com/mongodb/mongo python driver)周围。
mogo提供了在mvc环境中使用pymongo的帮助程序
(如点属性语法、模型方法、
引用字段等)。
虽然pymongo使用简单且非常灵活,但它对mvc没有帮助,因为您使用的是普通的dict
,并且不能在任何地方附加模型逻辑。
mogo是在apache许可下获得许可的,版本2.0
(http://www.apache.org/licenses/license-2.0.html).
功能
——
*在pymongo结果周围放置类/结构
*模型是dict,因此dot属性或密钥访问是有效的。dot attribute
提供"smart"值,key access提供"raw"pymongo值。
*支持指定field()属性,而无需
它们或强制类型。
*简单的referencefield实现。
需求
----
*pymongo-http://github.com/mongodb/mongo python驱动程序安装
测试
----
要运行测试,请确保在本地计算机上有一个运行
的MongoDB实例。它将写入并删除
mogotest db的条目,因此,如果您有/需要这样做,您可能需要更改mogo/tests.py
文件中的dbname常量。
安装后,或从根项目目录运行:
``sh
nosettests/
```
如果没有nose,则可以使用:
``sh
pip install nose
``````
importing
--
mogo模块的顶层下提供所有主要类和函数:
``python
import mogo
l,field,connect,referencefield
```
connecting
----
MOGO使用单个全局连接,因此一旦连接,就可以开始访问模型类方法。连接方式如下:
``python
from mogo import connect
connect("foobar",host="127.0.0.1",port=28088)
connect(uri="mongodb://user:pass@192.168.0.5/awesome")用于heroku等。/>
如果需要对一段代码使用备用连接,而不会丢失主连接,则可以使用以下样式:
_数据库"):
处理其他数据库的事务
```
models
----
模型是dict的子类,具有一些预定义的类和实例
方法。它们的设计应该使您能够在现有的MongoDB项目中使用它们(警告:这是Alpha!)
您只需要一个具有正确集合名称的类,并在访问它之前将其连接到数据库。
是的,这意味着最基本的示例只是一个没有任何内容的类:
``python
``class hero(model):
pass
````
``` python
hero=hero.find({"name":"malcolm reynolds"}).first()
```
默认情况下,它将使用模型的小写名称作为集合名称。因此,在上面的例子中,等价的pymongo
调用应该是:
``python
db.hero.find({"name":"malcolm reynolds"})[0]
`````
%"小S太自命不凡了!"%self["名称"]
mal=hero.find({"name":"mal"}).first()
hero.swashback()
```
由于模型只是字典的子类,因此您可以使用(大多数)普通字典方法(请参阅稍后的"update"):
``python
hero=hero.find呸one({"name":"book"})
hero.get("powers",["big darn hero"])returns["big darn hero"]
hero呸dict=hero.copy()
对于key,hero.iteritems()中的值:
打印key,value
````
要保存或更新数据库中的值,可以使用"save"或"update"。(想象一下。)如果它是一个新对象,您必须首先"save"
它:
``python
mal=hero(name="malcom reynolds")
mal.save()
```
`save`将始终覆盖数据库中的整个条目。
这与pymongo使用的行为是相同的,并且对
更简单的列表和字典用法:
``python
zoe=hero(name="zoe",powers=["warrior woman"])
zoe.save()
zoe["powers"].append("big darn hero")
zoe.save()
````
…但是,这最终可能是低效的,更不用说创造种族条件和体育ople在每个
其他更改上进行保存。
这就是"更新"的来源。请注意,"update"方法的功能与dictionary方法不同。它有两个角色,
取决于它是从类还是从实例调用。
pants"},safe=true)
t"更新:
```python
hero=hero.find乇one({"name":"river tam"})
hero.update(powers=["心灵感应","神秘怪异"])
epathy,"神秘怪诞"]})
```
(beta)如果从游标调用它,它将使用最初提供给游标的查询。这目前不尊重
附加的过滤,如"where()",在设置值时不检查类型,而且还没有经过详尽的测试。(所以要小心。)
``python
`hero cursor=hero.find({"name":{"$in":["river","simon"]})
hero cursor.update({"$push":{"powers":"siblingness"})
d(通常)是必要的,原因有很多。虽然
您可以在mongo中完全保持无模式,但如果不记录您正在使用的标准顶级字段,您可能会变得有点疯狂。
字段只需在模型上这样做:
``python
``class hero(model):
name=field()
````
…并启用dot属性访问,以及其他一些优点。
字段有几个可选参数——第一个参数是
类型,如果使用,则字段将验证作为该(子)类的
实例传递的任何值。例如:
``python
class hero(model):
name=field(unicode)
任何类型。如果要自定义获取和设置,可以将"set"回调函数和"get"回调函数传递给字段构造函数:
``python
class ship(model):
type=field(set_callback=lambda x:"firefly")
print ship.type打印"firefly"
ship.type="ncc 1701"
打印船舶。type打印"firefly"
覆盖"real"存储值
船舶["type"]="millenium falcon"
打印船舶。type打印"millenium falcon"
`````
您还可以传递一个可选的默认值,其中value要么是静态值,如"foo"或42,要么是可调用的,返回静态值,如time.time()或datetime.now()。(谢谢你的点头!)
`` python
类ship(model):
name=field(unicode,default=u"dormunder")
```
referencefield
----
referencefield类允许使用(简单的)模型引用。
"search"类方法允许传入模型实例并进行比较。
所以大多数现实世界的模型看起来更像这样:
`` python
类ship(model):
name=field(unicode,必需=true)
age=field(int,默认=10)
type=field(unicode,默认=firefly)
@classmethod
def new(cls,name):
为新模型""创建严格的接口"
def crew(self):
return crew.search(ship=self)
class crew(model):
name=field(unicode,required=true)
joined=field(float,default=datetime.now,required=true)
ship=referencefield(ship)
````
…简单的用法如下:
``python
serenity=ship.new(u"serenity")
serenity.save()
mal=crew(name=u"malcom reynolds",ship=none)
mal.sav()
mal.ship=serenity
mal.save()
print[serenit中人员的姓名y.crew]
结果是[u"malcom reynolds",]
打印mal.joined
打印创建实例的日期时间
````
注意--只有在将dbref存储为值时,才对遗留数据使用referencefield。如果您刚刚存储了objectid或
一些东西,那么现有的数据可能更容易使用field()和
a`(set get)\\u callback`自己执行检索逻辑。
--
mongodb允许您在任何集合中存储任何字段——这意味着它是
特别适合跨继承关系存储和查询。我最近添加了一种新的"polymodel"模型类型,它可以让您以一种(希望是)简单的方式定义它。
``python
class person(polymodel):
"base"person model"
name=field(unicode,required=true)
role=field(unicode,default=u"person")
自定义方法
def是好的(自我):
"所有人天生都是好的。:)"
return true
fore应该返回一个person实例。我们需要注册一些新的人物类型:
``python
@person.register
class villain(person):
role=field(unicode,default=u"villain")
/>@person.register("可疑")
类触发器(person):
角色=字段(unicode,默认值=u"可疑")
联盟=字段(unicode,默认值=u"好")
返回self.alliance=="好的"
def贸易联盟(self):
if self.alliance=="good":
self.alliance="bad"
else:
self.alliance="good"
self.save()
````
polymodel.register decorator接受一个可选值参数,该参数用于与"get"m指定的字段进行比较odel_key`输入
基本模型。它使用以下伪逻辑:
*创建一个新的person实例(从db或_u in it_uu)
*key=person.get_u model_u key();在本例中,它是"role"
*获取"role"的当前值(或使用默认值)
*检查注册的模型,找到与角色值匹配的实例因此。
*否则,使用基类(本例中的person)
r.save()
badger.isa.isu good()false
jayne=flipfloppper(name="jayne")
jayne.save()
person.find().count()应为3
jayne=person.find(name="jayne")
isinstance(jayne,flipfloppper)isinstance(jayne,flipfloppper)isinstance(jayne,flipfloppper)isinstance(jayne.isinstance(jayne,jayne,flipfloppper)isinstance(jayne.isinstance(jayne.isinstance.isu good()yne.is_good()假
===
这个库是一个简单的"无模式"对象包装器,位于
pymongo库(http://github.com/mongodb/mongo python driver)周围。
mogo提供了在mvc环境中使用pymongo的帮助程序
(如点属性语法、模型方法、
引用字段等)。
虽然pymongo使用简单且非常灵活,但它对mvc没有帮助,因为您使用的是普通的dict
,并且不能在任何地方附加模型逻辑。
mogo是在apache许可下获得许可的,版本2.0
(http://www.apache.org/licenses/license-2.0.html).
功能
——
*在pymongo结果周围放置类/结构
*模型是dict,因此dot属性或密钥访问是有效的。dot attribute
提供"smart"值,key access提供"raw"pymongo值。
*支持指定field()属性,而无需
它们或强制类型。
*简单的referencefield实现。
需求
----
*pymongo-http://github.com/mongodb/mongo python驱动程序安装
测试
----
要运行测试,请确保在本地计算机上有一个运行
的MongoDB实例。它将写入并删除
mogotest db的条目,因此,如果您有/需要这样做,您可能需要更改mogo/tests.py
文件中的dbname常量。
安装后,或从根项目目录运行:
``sh
nosettests/
```
如果没有nose,则可以使用:
``sh
pip install nose
``````
importing
--
mogo模块的顶层下提供所有主要类和函数:
``python
import mogo
l,field,connect,referencefield
```
connecting
----
MOGO使用单个全局连接,因此一旦连接,就可以开始访问模型类方法。连接方式如下:
``python
from mogo import connect
connect(uri="mongodb://user:pass@192.168.0.5/awesome")用于heroku等。/>
如果需要对一段代码使用备用连接,而不会丢失主连接,则可以使用以下样式:
_数据库"):
处理其他数据库的事务
```
models
----
模型是dict的子类,具有一些预定义的类和实例
方法。它们的设计应该使您能够在现有的MongoDB项目中使用它们(警告:这是Alpha!)
您只需要一个具有正确集合名称的类,并在访问它之前将其连接到数据库。
是的,这意味着最基本的示例只是一个没有任何内容的类:
``python
``class hero(model):
pass
````
``` python
hero=hero.find({"name":"malcolm reynolds"}).first()
```
默认情况下,它将使用模型的小写名称作为集合名称。因此,在上面的例子中,等价的pymongo
调用应该是:
``python
db.hero.find({"name":"malcolm reynolds"})[0]
`````
%"小S太自命不凡了!"%self["名称"]
mal=hero.find({"name":"mal"}).first()
hero.swashback()
```
由于模型只是字典的子类,因此您可以使用(大多数)普通字典方法(请参阅稍后的"update"):
``python
hero=hero.find呸one({"name":"book"})
hero.get("powers",["big darn hero"])returns["big darn hero"]
hero呸dict=hero.copy()
对于key,hero.iteritems()中的值:
打印key,value
````
要保存或更新数据库中的值,可以使用"save"或"update"。(想象一下。)如果它是一个新对象,您必须首先"save"
它:
``python
mal=hero(name="malcom reynolds")
mal.save()
```
`save`将始终覆盖数据库中的整个条目。
这与pymongo使用的行为是相同的,并且对
更简单的列表和字典用法:
``python
zoe=hero(name="zoe",powers=["warrior woman"])
zoe.save()
zoe["powers"].append("big darn hero")
zoe.save()
````
…但是,这最终可能是低效的,更不用说创造种族条件和体育ople在每个
其他更改上进行保存。
这就是"更新"的来源。请注意,"update"方法的功能与dictionary方法不同。它有两个角色,
取决于它是从类还是从实例调用。
pants"},safe=true)
t"更新:
```python
hero=hero.find乇one({"name":"river tam"})
hero.update(powers=["心灵感应","神秘怪异"])
epathy,"神秘怪诞"]})
```
(beta)如果从游标调用它,它将使用最初提供给游标的查询。这目前不尊重
附加的过滤,如"where()",在设置值时不检查类型,而且还没有经过详尽的测试。(所以要小心。)
``python
`hero cursor=hero.find({"name":{"$in":["river","simon"]})
hero cursor.update({"$push":{"powers":"siblingness"})
d(通常)是必要的,原因有很多。虽然
您可以在mongo中完全保持无模式,但如果不记录您正在使用的标准顶级字段,您可能会变得有点疯狂。
字段只需在模型上这样做:
``python
``class hero(model):
name=field()
````
…并启用dot属性访问,以及其他一些优点。
字段有几个可选参数——第一个参数是
类型,如果使用,则字段将验证作为该(子)类的
实例传递的任何值。例如:
``python
class hero(model):
name=field(unicode)
任何类型。如果要自定义获取和设置,可以将"set"回调函数和"get"回调函数传递给字段构造函数:
``python
class ship(model):
type=field(set_callback=lambda x:"firefly")
ship.type="ncc 1701"
打印船舶。type打印"firefly"
覆盖"real"存储值
船舶["type"]="millenium falcon"
打印船舶。type打印"millenium falcon"
`````
您还可以传递一个可选的默认值,其中value要么是静态值,如"foo"或42,要么是可调用的,返回静态值,如time.time()或datetime.now()。(谢谢你的点头!)
`` python
类ship(model):
name=field(unicode,default=u"dormunder")
```
referencefield
----
referencefield类允许使用(简单的)模型引用。
"search"类方法允许传入模型实例并进行比较。
所以大多数现实世界的模型看起来更像这样:
`` python
类ship(model):
name=field(unicode,必需=true)
age=field(int,默认=10)
type=field(unicode,默认=firefly)
@classmethod
def new(cls,name):
为新模型""创建严格的接口"
return crew.search(ship=self)
class crew(model):
name=field(unicode,required=true)
joined=field(float,default=datetime.now,required=true)
ship=referencefield(ship)
````
…简单的用法如下:
``python
serenity=ship.new(u"serenity")
serenity.save()
mal=crew(name=u"malcom reynolds",ship=none)
mal.sav()
mal.ship=serenity
mal.save()
print[serenit中人员的姓名y.crew]
结果是[u"malcom reynolds",]
打印mal.joined
打印创建实例的日期时间
````
注意--只有在将dbref存储为值时,才对遗留数据使用referencefield。如果您刚刚存储了objectid或
一些东西,那么现有的数据可能更容易使用field()和
a`(set get)\\u callback`自己执行检索逻辑。
mongodb允许您在任何集合中存储任何字段——这意味着它是
特别适合跨继承关系存储和查询。我最近添加了一种新的"polymodel"模型类型,它可以让您以一种(希望是)简单的方式定义它。
``python
class person(polymodel):
"base"person model"
name=field(unicode,required=true)
role=field(unicode,default=u"person")
自定义方法
def是好的(自我):
"所有人天生都是好的。:)"
return true
fore应该返回一个person实例。我们需要注册一些新的人物类型:
``python
@person.register
class villain(person):
role=field(unicode,default=u"villain")
/>@person.register("可疑")
类触发器(person):
角色=字段(unicode,默认值=u"可疑")
联盟=字段(unicode,默认值=u"好")
def贸易联盟(self):
if self.alliance=="good":
self.alliance="bad"
else:
self.alliance="good"
self.save()
````
polymodel.register decorator接受一个可选值参数,该参数用于与"get"m指定的字段进行比较odel_key`输入
基本模型。它使用以下伪逻辑:
*创建一个新的person实例(从db或_u in it_uu)
*key=person.get_u model_u key();在本例中,它是"role"
*获取"role"的当前值(或使用默认值)
*检查注册的模型,找到与角色值匹配的实例因此。
*否则,使用基类(本例中的person)
r.save()
badger.isa.isu good()false
jayne=flipfloppper(name="jayne")
jayne.save()
person.find().count()应为3
jayne=person.find(name="jayne")
isinstance(jayne,flipfloppper)isinstance(jayne,flipfloppper)isinstance(jayne,flipfloppper)isinstance(jayne.isinstance(jayne,jayne,flipfloppper)isinstance(jayne.isinstance(jayne.isinstance.isu good()yne.is_good()假