美文网首页
基于ES的ORM运用(python版)

基于ES的ORM运用(python版)

作者: andrew_su_cd | 来源:发表于2019-10-19 11:28 被阅读0次

    1、ES也有ORM?
    是的,现在ORM作为标配,如果某种数据存储技术诞生之后,没有ORM来对应,简直是不可思议的事情。
    将数据对应到程序中的模型类,然后针对模型类的实例进行操作,这也是诸多开发框架的运用数据的标准动作

    2、基本准备:
    安装elasticsearch
    安装基于python的对接elasticsearch的ORM包:elasticsearch_dsl

    3、编写模型

    必要的包:DocType是基类,Text等是字段,connections是定义连接,在类的外边进行定义

    from elasticsearch_dsl import DocType,Text
    from elasticsearch_dsl.connections import connections

    connections.create_connection(hosts=[host1,host2],http_auth=(username,password))

    class User(DocType):
    name=Text()

    class Index:
          name='test_user'
    

    初始化,这时候会连接后台的elasticsearch,并在es中创建mapping

    User.init()

    创建实例,并保存

    user=User(name='林妹妹')
    user.save()

    查询,程序员最友好的链式操作

    users = User().search().query('match',name='林妹妹').execute()
    users[0]

    3、数据的序列化、validation,这时候需要使用marshmallow的schema

    schema可以定义数据格式,类型,可以方便的处理序列化问题

    from marshmallow import Schema,fields,post_load

    import User

    class UserSchema(Schema):
    name=fields.Str()

    # 加一个注释,说明在load之后,需要有一个钩子,callback,这样还是蛮方便的
    @post_load
    def save_user(self,data,**kwargs):
        return User(**data)
    

    schema在前端控制器层面的用法

    data={'name':'test user'}
    data1={'name':1234}

    这个可以正常执行

    UserSchema().load(data).save()

    这个执行有异常,因为data1是数字,不是字符串,这在UserSchema中已经定义

    UserSchema().load(data1).save()

    因而上述这句,通常放在try中

    try:
    UserSchema().load(data1).save()
    except Exception as e:
    print(e)
    print("参数有误")

    相关文章

      网友评论

          本文标题:基于ES的ORM运用(python版)

          本文链接:https://www.haomeiwen.com/subject/xhmgmctx.html