更改sqlite为mysql

from tortoise import Tortoise
import asyncio
async def init():
user = 'root'
password = '123456'
db_name = 'test'
await Tortoise.init(
#指定mysql信息
db_url=f'mysql://{user}:{password}@127.0.0.1:3306/{db_name}',
#指定models
modules={'models': ['sanic_bp.models']}
)
#按照模型生成表
# await Tortoise.generate_schemas()
asyncio.run(init())

在sanic中使用:

from sanic import Sanic
from tortoise import Tortoise app = Sanic(__name__) @app.listener('after_server_start')
async def notify_server_started(app, loop):
print('sanic sanic服务启动后建立mysql连接')
#实例化mysql连接
await Tortoise.init(
db_url='mysql://root:123456@127.0.0.1:3306/test?maxsize=50&minsize=3',
modules={'models': ['sanic_bp.models']}
)

基础使用


from tortoise.contrib.sanic import register_tortoise register_tortoise(
app, db_url="sqlite://:memory:", modules={"models": ["models"]}, generate_schemas=True
)

sanic 和 fastapi中使用

tortoise-orm 连接多个库

async def run():
await Tortoise.init(
{
#这里面指定两个不同的数据库,虽然它填写的都是一样的
"connections": {
"first": {
"engine": "tortoise.backends.sqlite",
"credentials": {"file_path": "example.sqlite3"},
},
"second": {
"engine": "tortoise.backends.sqlite",
"credentials": {"file_path": "example1.sqlite3"},
},
},
#可以指定多个不同的models, 嗯,它指定的也是一样的
"apps": {
"tournaments": {"models": ["__main__"], "default_connection": "first"},
"events": {"models": ["__main__"], "default_connection": "second"},
},
}
)
#await Tortoise.generate_schemas()
#选取数据库
client = Tortoise.get_connection("first")
#选取 models
second_client = Tortoise.get_connection("second")
#然后这下面就可以进行orm操作了

增删改查

from typing import List
from fastapi import APIRouter, HTTPException
from tortoise.contrib.fastapi import HTTPNotFoundError from schemas.MaintainedData import MaintainedData_Pydantic, MaintainedDataIn_Pydantic
from models.MaintainedData import MaintainedData
from schemas.basic import Response404, Response200 data = APIRouter(tags=['数据模块']) @data.get("/", summary="数据列表", response_model=List[MaintainedData_Pydantic])
async def data_list(order:str,limit: int = 10, page: int = 1):
# limit 是显示的条数 ,page是页数 skip = (page - 1) * limit
# select * from movie limit offset,limit
# select * from movie limit 0,10
return await MaintainedData_Pydantic.from_queryset(MaintainedData.all().offset(skip).limit(limit)) @data.post("/data", summary="新增数据", )
async def add_data(md_data: MaintainedData_Pydantic):
movie_obj = await MaintainedData.create(**md_data.dict(exclude_unset=True))
# movie_obj = await Movie.create(name="",year="",xx="")
return await MaintainedData_Pydantic.from_tortoise_orm(movie_obj) @data.put("/data/{data_id}", summary="编辑数据", responses={404: {"model": HTTPNotFoundError}})
async def update_data(site_id: str, md_data: MaintainedDataIn_Pydantic):
updated_count = await MaintainedData.filter(site_id=site_id).update(**md_data.dict(exclude_unset=True))
print(updated_count)
if not updated_count:
return Response404(msg=f"data {site_id} not found")
return Response200(data=await MaintainedData_Pydantic.from_queryset_single(MaintainedData.get(site_id=site_id))) @data.get("/data/{data_id}", summary="查找数据", response_model=MaintainedData_Pydantic,
responses={404: {"model": HTTPNotFoundError}})
async def get_user(site_id: str):
return await MaintainedData_Pydantic.from_queryset_single(MaintainedData.get(site_id=site_id)) @data.delete("/data/{data_id}", summary="删除数据", responses={404: {"model": HTTPNotFoundError}})
async def del_movie(site_id: str):
deleted_count = await MaintainedData.filter(site_id=site_id).delete()
if not deleted_count:
raise HTTPException(status_code=404, detail=f"data {site_id} not found")
return HTTPException(status_code=200, detail=f"Deleted Movie {site_id}")

models.py

from datetime import datetime
from typing import Optional, Iterable from tortoise import fields, models, BaseDBAsyncClient class MaintainedData(models.Model):
"""
The User model
"""
id = fields.SmallIntField(pk=True, index=True, description="ID", )
site_id = fields.CharField(max_length=20, unique=True, description="网站ID")
site_name = fields.CharField(max_length=128, null=False, description="网站名称")
site_type = fields.CharField(max_length=16, null=False, description="网站类型")
description = fields.CharField(max_length=255, default="",description="网站备注", )
site_path_name = fields.CharField(max_length=128, null=True, description="目录名称")
site_path_url = fields.CharField(max_length=128, null=True, description="目录链接")
status = fields.CharField(max_length=128, null=True, description="脚本状态")
run_computer = fields.CharField(max_length=255, null=True, description="运行电脑")
run_directory = fields.CharField(max_length=255, null=True, description="运行目录")
crawling_time :Optional[datetime]= fields.DatetimeField(auto_add=True, description="运行时间")
err_message = fields.CharField(max_length=255, null=True, description="错误信息")

order by

db_Secc = MaintainedData.all().order_by("crawling_time")

Eum 枚举

class order_byEnum(str, Enum):
pear = ""
banana = '-' @data.get("/", summary="数据列表", response_model=List[MaintainedData_Pydantic])
async def data_list(
order_by: order_byEnum = "",
limit: int = 10,
page: int = 1):
# limit 是显示的条数 ,page是页数
skip = (page - 1) * limit
return await MaintainedData_Pydantic.from_queryset(MaintainedData.all().offset(
skip).limit(
limit).order_by(
f"{order_by}crawling_time"))

FastAPI + tortoise-orm基础使用的更多相关文章

  1. ORM基础知识

    ORM基础知识 一.什么ORM? ORM是Object Relactional Mapping的缩写,即对象关系映射,是将关系型数据库中的数据库结构映射成对象,就可以通过面向对象思想编程. 二.常用的 ...

  2. 深入理解Magento – 第四章 – 模型和ORM基础

    深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第四章 – 模型和ORM基础 对于任何一个MVC架构,模型(Model)层的实现都是占据了很大一部分.对于Mage ...

  3. day 67 django 之ORM 基础安装

    一 ORM的基础部分 1 ORM的概念 对象关系映射(Object Relational Mapping(映射),简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 2   ...

  4. Magento模型和ORM基础

    对于任何一个MVC架构,模型(Model)层的实现都是占据了很大一部分.对于Magento来说,模型占据了一个更加重要的位置,因为它常常包含了一部分商业逻辑代码(可以说它对,也可以说它错).这些代码在 ...

  5. Django之ORM基础

    ORM简介 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  6. ORM基础之ORM介绍和基础操作

    一.ORM介绍 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过 ...

  7. ORM基础之字段及其参数介绍

    一.外键ForeignKey 1.字段参数 1.to 设置要关联的表 2.to_field 设置要关联的表的字段(一般不设置,默认使用主键id关联) 3.related_name 反向操作时,使用的字 ...

  8. Django models ORM基础操作--白话聊Django系列

    上次我们讲完了views视图,那我们这次来看一下Django强大的ORM,可以这么说,你不懂Django的ORM,你就不懂Django,那废话不多说 ORM又称关系对象映射,在ORM里,一张表就是一个 ...

  9. Python orm基础

    ORM 对象映射关系程序. 通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sq ...

  10. .NET进阶——ORM基础认识

    ORM对象关系映射,对象即实体,关系即关系数据库表.ORM即实现从实体对象关系数据库数据的映射. 本质上就是将数据从一种形式转换到还有一种形式.它详细又有哪些表现呢.咱们一步步学习,一步步分析. OR ...

随机推荐

  1. LOJ6671 EntropyIncreaser 与 Minecraft (生成函数)

    题面 EntropyIncreaser 是组合计数大师. EntropyIncreaser 很喜欢玩麦块.当然,EntropyIncreaser 拥有非同常人的超能力,他玩的是MOD版的 n 维麦块, ...

  2. 【MySQL】从入门到精通9-数据库的备份(完结)

    上期:[MySQL]从入门到精通8-SQL数据库编程 第一章:数据的导出 回到我们的Workbench. 选择Data Export. 选择需要导出的数据库. 注意,如果选择"Export ...

  3. KingbaseES R6 集群通过备库clone在线添加新节点

    案例说明: KingbaseES R6集群可以通过图形化方式在线添加新节点,但是在添加新节点clone环节时,是从主库copy数据到新的节点,这样在生产环境,如果数据量大,将会对主库的网络I/O造成压 ...

  4. java 类名后加变量名是什么意思?

    回答这个问题我们需要先了解两个事情: A是一个类,我们如果对他进行实例化,需要这样写: A a = new A(); 详细解释一下这个语句,首先等号左边做的事情:在JVM栈内存(stack)中定义了一 ...

  5. 人脸识别、活体检测(眨眼、摇头、张嘴动作)clmtrackr

    人脸识别.活体检测(眨眼.摇头.张嘴动作)项目总结 项目需求 / 步骤实现描述: 1.申请摄像头权限,开始识别面部信息.同时开始录像 : 2.随机顺序生成面部检验动作: 3.并开始倒计时,需10s内完 ...

  6. 2.69分钟完成BERT训练!新发CANN 5.0加持

    摘要:快,着实有点快. 现在,经典模型BERT只需2.69分钟.ResNet只需16秒. 啪的一下,就能完成训练! 本文分享自华为云社区<这就是华为速度:2.69分钟完成BERT训练!新发CAN ...

  7. 深度剖析Istio共享代理新模式Ambient Mesh

    摘要:今年9月份,Istio社区宣布Ambient Mesh开源,由此引发国内外众多开发者的热烈讨论. 本文分享自华为云社区<深度剖析!Istio共享代理新模式Ambient Mesh>, ...

  8. 第六章:Django 综合篇 - 13:发送邮件

    在Python中已经内置了一个smtp邮件发送模块,Django在此基础上进行了简单地封装,让我们在Django环境中可以更方便更灵活的发送邮件. 所有的功能都在django.core.mail中. ...

  9. ProxySQL 配置ProxySQL

    转载自:https://www.jianshu.com/p/212397a1be67 假定你已经对ProxySQL的架构有所了解.本文对ProxySQL的所有配置都是使用Admin管理接口完成的,该管 ...

  10. Kubernetes 配置管理

    ConfigMap(可变配置管理) 对于应用的可变配置在 Kubernetes 中是通过一个 ConfigMap 资源对象来实现的,我们知道许多应用经常会有从配置文件.命令行参数或者环境变量中读取一些 ...