简单的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()假

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

推荐PyPI第三方库


热门话题
java为什么整数构造函数方法不再需要属性?   java单函数从广播接收器检索数据   Java类中的Scala设置器和获取器   JAVA MVC表选择的行ID和mysql db ID不同   java在Multimaps Guava中获取值   jakarta ee Intellij IDEA Java类在保存时不自动编译   java在另一个Spring实体中使用Spring实体   JTwitter库的安卓类一直在给我java。朗朗:温特韦尔。杰特维特。啁啾   java停止启动应用程序   java Jersey测试NoSuchMethodError   java如何处理合成元素上的注释   java崩溃shell无法通过ssh连接   java计算两个日期之间的天数后(取自edittext)如何在新的edittext中显示天数