【FastAPI】 FastAPI 完成对 Elasticsearch 的异步数据插入

本文演示如何使用 elsatiscsearch_dsl + elasticsearch 在 FastAPI 下完成异步插入 ES 数据。
对 Elasticsearch 的异步操作需要 Python 库 elasticsearch>=7.8.0 ,若不符合版本要求的话需要进行安装或更新。

1. 创建 ES Client

dependences.py 中书写 ES Client 依赖:

from elasticsearch import AsyncElasticsearch
from functools import lru_cache


@lru_cache
def get_es() -> AsyncElasticsearch:
    """
    获取 ES Client 对象
    """
    return AsyncElasticsearch(
        hosts=['127.0.0.1', ],
        port=9200,
        timeout=200
    )

2. 创建 Document 数据类型

假设我们创建一个用户类型,在持久层文件 es_po.py 中书写:

from elasticsearch_dsl import Document, Date, InnerDoc, Keyword, Text, Integer
from datetime import datetime


class UserInEs(Document):
	updated_time = Date()
	uid = Text(fields={'raw': Keyword()})
	screen_name = Text()
	age = Integer()
	
	class Index:
		"""在ES中的Index名"""
		name = 'users'
	
	def save(self, **kwargs):
		self.updated_time = datetime.now()
		return super().save(**kwargs)

3. 在 ES 创建 index (只需要做一次)

可以通过 ES 客户端创建,也可以通过以下 Python 实现:

from dependencies import get_es
from es_po import UserInEs


es_client = get_es()
UserInEs.init(using=es_client)

4. 加入视图函数(controller)中

from fastapi import FastAPI, Depends
from pydantic import UserModel
from elasticsearch7 import AsyncElasticsearch
from elasticsearch.helpers import async_bulk
import uvicorn

from es_po import UserInEs
from dependencies import get_es


app = FastAPI()

class UserModel(BaseModel):
	uid: str
	screen_name: str
	age: int


@app.post('/create')
async def create_user(user: UserModel,
				es_client: AsyncElasticsearch = Depends(get_es)):
	user_doc = UserInEs(**user.dict())
	await async_bulk(es_client, [user_doc.to_dict(), ])
	return {'data': 'success'}


uvicorn.run(app, '127.0.0.1', 8080)

5. 测试

127.0.0.1:8080/create 发送一个 POST 请求并携带相关参数就可完成在 ES 中的文档插入。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值