flask mongoengine的使用(一)查詢


from flask_mongoengine import MongoEngine

db = MongoEngine()



class ConfigureEnvModel(db.Document):
    id = db.StringField(required=True, max_length=50, unique=True, primary_key=True)
    name = db.StringField(required=False, max_length=50)

    meta = {
            "collection": "configure_env",
            "index": [{
                'fields': ['id'],
                'unique': True,
                }]
            }

class ConfigureDisconfModel(db.Document):
    id = db.StringField(required=True, max_length=50, unique=True, primary_key=True)
    env = db.StringField(required=False, max_length=50)
    name = db.StringField(required=False, max_length=50)
    username = db.StringField(required=False, max_length=50)
    password = db.StringField(required=False, max_length=50)
    url = db.StringField(required=False, max_length=50)

    meta = {
            "collection": "configure_disconf",
            "index": [{
                'fields': ['id'],
                'unique': True,
                }]
            }


class ConfigureNginxModel(db.Document):
    id = db.StringField(required=True, max_length=50, unique=True, primary_key=True)
    env = db.StringField(required=False, max_length=50)
    name = db.StringField(required=False, max_length=50)
    url = db.StringField(required=False, max_length=50)

    meta = {
            "collection": "configure_nginx",
            "index": [{
                'fields': ['id'],
                'unique': True,
                }]
            }





import logging

from flask_restful import reqparse, Api, Resource, fields

from uop.configure import configure_blueprint
from uop.models import ConfigureEnvModel 
from uop.models import ConfigureNginxModel 
from uop.models import ConfigureDisconfModel 

configure_api = Api(configure_blueprint)


class ConfigureEnv(Resource):

    @classmethod
    def get(cls):
        # NOTE: 所有結果查詢
        ret = ConfigureEnvModel.objects.all()
        #ret = ConfigureEnvModel.objects()
        envs = []
        for env in ret: 
            envs.append(dict(id=env.id, 
                             name=env.name))
        res = {
                'code': 200,
                'result': {
                    'res': envs,
                    'msg': u'請求成功'
                    }
                }
        return res

class Configure(Resource):

    @classmethod
    def get(cls):
        parser = reqparse.RequestParser()
        parser.add_argument('env', type=str)
        parser.add_argument('category', type=str)
        args = parser.parse_args()
        category = parser.parse_args()
        env = args.env if args.env else 'dev'
        category = args.category if args.category else 'nginx'
        logging.info("[UOP] Get configs, env:%s, category: %s", env, category)
        envs = []
        if category == 'nginx':
            # NOTE: 條件查詢 下面2條語句效果等價
            ret = ConfigureNginxModel.objects.filter(env=env)
            # ret = ConfigureNginxModel.objects(env=env)
            for env in ret: 
                envs.append(dict(id=env.id, 
                                 name=env.name,
                                 url=env.url))
        else: # disconf
            ret = ConfigureDisconfModel.objects.filter(env=env)
            for env in ret: 
                envs.append(dict(id=env.id, 
                                 name=env.name,
                                 username=env.username,
                                 password=env.password,
                                 url=env.url))
        res = {
                'code': 200,
                'result': {
                    'res': envs,
                    'msg': u'請求成功'
                    }
                }
        return res

    @classmethod
    def post(cls):
        parser = reqparse.RequestParser()
        parser.add_argument('env', type=str)
        parser.add_argument('category', type=str)
        parser.add_argument('url', type=str)
        parser.add_argument('name', type=str)
        parser.add_argument('username', type=str)
        parser.add_argument('password', type=str)
        args = parser.parse_args()
        env = args.env if args.env else 'dev'
        url = args.url if args.url else 'dev'
        name = args.name if args.name else ''
        username = args.username if args.username else 'dev'
        password = args.password if args.password else 'dev'
        category = args.category if args.category else 'nginx'
        logging.info("[UOP] Create configs, env:%s, category: %s", env, category)
        import uuid
        id = str(uuid.uuid1())
        if category == 'nginx':
            # NOTE: 建立一個document
            ret = ConfigureNginxModel(env=env,
                                     url=url,
                                     name=name,
                                     id=id).save()
        else:
            ret = ConfigureDisconfModel(env=env,
                                     url=url,
                                     name=name,
                                     username=username,
                                     password=password,
                                     id=id).save()
        res = {
                'code': 200,
                'result': {
                    'res': id,
                    'msg': u'請求成功'
                    }
                }
        return res

    @classmethod
    def put(cls):
        parser = reqparse.RequestParser()
        parser.add_argument('env', type=str)
        parser.add_argument('category', type=str)
        parser.add_argument('url', type=str)
        parser.add_argument('name', type=str)
        parser.add_argument('username', type=str)
        parser.add_argument('password', type=str)
        parser.add_argument('id', type=str)
        args = parser.parse_args()
        category = parser.parse_args()
        env = args.env if args.env else 'dev'
        id = args.id if args.id else ''
        url = args.url if args.url else ''
        name = args.name if args.name else ''
        category = args.category if args.category else 'nginx'
        username = args.username if args.username else ''
        password = args.password if args.password else ''
        logging.info("[UOP] Modify configs, env:%s, category: %s", env, category)

        if category == 'nginx':
            ret = ConfigureNginxModel.objects(id=id)
            #NOTE: ret = ConfigureNginxModel.objects.filter(id=id)
            ret.update(name=name,url=url)
        else:
            ret = ConfigureDisconfModel.objects(id=id)
            ret.update(name=name,url=url,username=username,password=password)

        res = {
                'code': 200,
                'result': {
                    'msg': u'請求成功'
                    }
                }
        return res

    @classmethod
    def delete(cls):
        parser = reqparse.RequestParser()
        parser.add_argument('env', type=str)
        parser.add_argument('category', type=str)
        parser.add_argument('id', type=str)
        args = parser.parse_args()
        category = parser.parse_args()
        env = args.env if args.env else 'dev'
        category = args.category if args.category else 'nginx'
        id = args.id if args.id else -1 
        logging.info("[UOP] Delete configs, env:%s, category: %s, id: %s", env, category, id)


        if category == 'nginx':
            # NOTE:  查詢一個document
            # ConfigureNginxModel.objects.filter(id=id).delete() 等價于 ConfigureNginxModel.objects.delete()
            ret = ConfigureNginxModel.objects.filter(id=id)
        else:
            ret = ConfigureDisconfModel.objects.filter(id=id)
        if len(ret):
            ret.delete()
        else:
            logging.info("[UOP] Do not found the item, id:%s", id)

        res = {
                'code': 200,
                'result': {
                    'msg': u'請求成功'
                    }
                }
        return res


configure_api.add_resource(ConfigureEnv, '/env')
configure_api.add_resource(Configure, '/')


擴展閱讀

flask-mongoengire 的文檔比較缺乏舟肉,這里主要看mongoengine 的文檔伺帘。

https://pypi.python.org/pypi/flask-mongoengine

2.5. Querying the database
http://docs.mongoengine.org/guide/querying.html?highlight=modify
簡介:

查詢:
The query may be filtered by calling the [QuerySet
](http://docs.mongoengine.org/apireference.html#mongoengine.queryset.QuerySet) object with field lookup keyword arguments. The keys in the keyword arguments correspond to fields on the [Document
](http://docs.mongoengine.org/apireference.html#mongoengine.Document) you are querying:
# This will return a QuerySet that will only iterate over users whose# 'country' field is set to 'uk'uk_users = User.objects(country='uk')

2.3. Defining documents
https://mongoengine-odm.readthedocs.io/guide/defining-documents.html#defining-a-document-s-schema

簡介:

mongo engine 的文檔沉颂。 



如何定義一個schema.


MongoEngine allows you to define schemata for documents as this helps to reduce coding errors, and allows for utility methods to be defined on fields which may be present.

To define a schema for a document, create a class that inherits from Document. Fields are specified by adding field objects as class attributes to the document class:



from mongoengine import *
import datetime

class Page(Document):
    title = StringField(max_length=200, required=True)
    date_modified = DateTimeField(default=datetime.datetime.now)






 Document collections

Document classes that inherit directly from Document will have their own collection in the database. The name of the collection is by default the name of the class, converted to lowercase (so in the example above, the collection would be called page). If you need to change the name of the collection (e.g. to use MongoEngine with an existing database), then create a class dictionary attribute called meta on your document, and set collection to the name of the collection that you want your document class to use:

class Page(Document):
    title = StringField(max_length=200, required=True)
    meta = {'collection': 'cmsPage'}





查詢:

MongoEngine 也提供用原生的mongo語句來查詢。 

Raw queries

It is possible to provide a raw PyMongo query as a query parameter, which will be integrated directly into the query. This is done using the __raw__ keyword argument:

Page.objects(__raw__={'tags': 'coding'})



修改:

However, this doesn’t map well to the syntax so you can also use a capital S instead

Post.objects(comments__by="joe").update(inc__comments__S__votes=1)


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末柿估,一起剝皮案震驚了整個濱河市宜猜,隨后出現的幾起案子,更是在濱河造成了極大的恐慌们镜,老刑警劉巖币叹,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異模狭,居然都是意外死亡颈抚,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門嚼鹉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贩汉,“玉大人驱富,你說我怎么就攤上這事∑ノ瑁” “怎么了褐鸥?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長策菜。 經常有香客問我晶疼,道長,這世上最難降的妖魔是什么又憨? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任翠霍,我火速辦了婚禮,結果婚禮上蠢莺,老公的妹妹穿的比我還像新娘寒匙。我一直安慰自己,他們只是感情好躏将,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布锄弱。 她就那樣靜靜地躺著,像睡著了一般祸憋。 火紅的嫁衣襯著肌膚如雪会宪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天蚯窥,我揣著相機與錄音掸鹅,去河邊找鬼。 笑死拦赠,一個胖子當著我的面吹牛巍沙,可吹牛的內容都是我干的。 我是一名探鬼主播荷鼠,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼句携,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了允乐?” 一聲冷哼從身側響起矮嫉,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牍疏,沒想到半個月后蠢笋,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡麸澜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了奏黑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炊邦。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡编矾,死狀恐怖,靈堂內的尸體忽然破棺而出馁害,到底是詐尸還是另有隱情窄俏,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布碘菜,位于F島的核電站凹蜈,受9級特大地震影響,放射性物質發(fā)生泄漏忍啸。R本人自食惡果不足惜仰坦,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望计雌。 院中可真熱鬧悄晃,春花似錦、人聲如沸凿滤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翁脆。三九已至眷蚓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間反番,已是汗流浹背沙热。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恬口,地道東北人校读。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像祖能,于是被迫代替她去往敵國和親歉秫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容