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("参数有误")
网友评论