基于ES的ORM运用(python版)

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版))