FastAPI 结合 SQLAlchemy 操作 MySQL 数据库

文章目录

    • 1. 安装 SQLAlchemy
    • 2. 创建数据库
    • 3. SQLAlchemy 连接 MySQL
    • 4. 创建数据模型
    • 5. 创建 Pydantic 模型
    • 6. crud 工具
    • 7. main函数

learning from 《python web开发从入门到精通》

1. 安装 SQLAlchemy

  • pip install sqlalchemy

2. 创建数据库

  • mysql -u root -p 命令行登录 MySQL

创建数据库 fastapi_db

mysql> create database fastapi_db default charset utf8mb4 collate utf8mb4_unicode_ci;
Query OK, 1 row affected (0.04 sec)

3. SQLAlchemy 连接 MySQL

  • database.py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base# 数据库连接配置
SQLALCHEMY_DATABASE_URI = ("mysql+pymysql://root:123456@localhost/fastapi_db?charset=utf8mb4"#                用户:密码@服务器/数据库?参数
)# 创建数据库引擎
engine = create_engine(SQLALCHEMY_DATABASE_URI)
# 创建数据库会话
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 声明基类
Base = declarative_base()

4. 创建数据模型

  • models.py
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship
from .database import Base# 定义 User 类
class User(Base):__tablename__ = 'users'  # 定义表名id = Column(Integer, primary_key=True, index=True)email = Column(String(255), unique=True, index=True)hashed_password = Column(String(255))is_active = Column(Boolean, default=True)items = relationship("Item", back_populates="owner")# 关联 Item 表# 定义 Item 类
class Item(Base):__tablename__ = "items"id = Column(Integer, primary_key=True, index=True)title = Column(String(255), index=True)description = Column(String(255), index=True)owner_id = Column(Integer, ForeignKey('users.id'))owner = relationship("User", back_populates="items")# 关联 User 表

relationship 还不懂,有待学习 SQLAlchemy

5. 创建 Pydantic 模型

  • schemas.py
from typing import List
from pydantic import BaseModelclass ItemBase(BaseModel):title: strdescription: str = Noneclass ItemCreate(ItemBase):passclass Item(ItemBase):id: intowner_id: intclass Config:orm_mode = Trueclass UserBase(BaseModel):email: strclass UserCreate(UserBase):password: strclass User(UserBase):id: intis_active: boolitems: List[Item] = []class Config:orm_mode = True

6. crud 工具

  • crud.py
from sqlalchemy.orm import Sessionfrom . import models, schemasdef get_user(db: Session, user_id: int):"""根据id获取用户信息:param db: 数据库会话:param user_id: 用户id:return: 用户信息"""return db.query(models.User).filter(models.User.id == user_id).first()def get_user_by_email(db: Session, email: str):"""根据email获取用户信息:param db: 数据库会话:param email: 用户email:return: 用户信息"""return db.query(models.User).filter(models.User.email == email).first()def get_users(db: Session, skip: int = 0, limit: int = 100):"""获取特定数量的用户:param db: 数据库会话:param skip: 开始位置:param limit: 限制数量:return: 用户信息列表"""return db.query(models.User).offset(skip).limit(limit).all()def create_user(db: Session, user: schemas.UserCreate):"""创建用户:param db: 数据库会话:param user: 用户模型:return: 根据email和password登录的用户信息"""fake_hashed_password = user.password + "notreallyhashed"db_user = models.User(email=user.email, hashed_password=fake_hashed_password)db.add(db_user)      # 添加到会话db.commit()          # 提交到数据库db.refresh(db_user)  # 刷新数据库return db_userdef get_items(db: Session, skip: int = 0, limit: int = 100):"""获取指定数量的item:param db: 数据库会话:param skip: 开始位置:param limit: 限制数量:return: item列表"""return db.query(models.Item).offset(skip).limit(limit).all()def create_user_item(db: Session, item: schemas.ItemCreate, user_id: int):"""创建用户item:param db: 数据库会话:param item: Item对象:param user_id: 用户id:return: Item模型对象"""db_item = models.Item(**item.dict(), owner_id=user_id)db.add(db_item)db.commit()db.refresh(db_item)return db_item

7. main函数

from typing import Listfrom fastapi import Depends, FastAPI, HTTPException
from sqlalchemy.orm import Sessionfrom . import crud, models, schemas
from .database import SessionLocal, enginemodels.Base.metadata.create_all(bind=engine)app = FastAPI()# 依赖
def get_db():try:db = SessionLocal()yield dbfinally:db.close()@app.post("/users/", response_model=schemas.User)
def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):# 根据email查找用户db_user = crud.get_user_by_email(db, email=user.email)# 如果用户存在,提示该邮箱已经被注册if db_user:raise HTTPException(status_code=400, detail="Email already registered")# 返回创建的user对象return crud.create_user(db=db, user=user)@app.get("/users/", response_model=List[schemas.User])
def read_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):# 读取指定数量用户users = crud.get_users(db, skip=skip, limit=limit)return users@app.get("/users/{user_id}", response_model=schemas.User)
def read_user(user_id: int, db: Session = Depends(get_db)):# 获取当前id的用户信息db_user = crud.get_user(db, user_id=user_id)# 如果没有信息,提示用户不存在if db_user is None:raise HTTPException(status_code=404, detail="User not found")return db_user@app.post("/users/{user_id}/items/", response_model=schemas.Item)
def create_item_for_user(user_id: int, item: schemas.ItemCreate, db: Session = Depends(get_db)
):# 创建该用户的itemsreturn crud.create_user_item(db=db, item=item, user_id=user_id)@app.get("/items/", response_model=List[schemas.Item])
def read_items(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):# 获取所有itemsitems = crud.get_items(db, skip=skip, limit=limit)return items

在这里插入图片描述

(pt19) D:\web_python_dev>uvicorn fastapi_mysql.main:app --reload
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [6988] using watchgod
INFO:     Started server process [2112]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
mysql> use fastapi_db
Database changed
mysql> show tables;
+----------------------+
| Tables_in_fastapi_db |
+----------------------+
| items                |
| users                |
+----------------------+
2 rows in set (0.00 sec)

在这里插入图片描述
在网页里发送一个 post 请求后,查询 sql

mysql> select * from users;
+----+----------------+---------------------+-----------+
| id | email          | hashed_password     | is_active |
+----+----------------+---------------------+-----------+
|  1 | michael@xx.com | abcdnotreallyhashed |         1 |
+----+----------------+---------------------+-----------+
1 row in set (0.00 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 打开 ctl,Oracle 19c 随系统systemctl启动数据库

Oracle 19c 随系统systemctl启动数据库一、 修改oratab文件[rootadg19c ~]# grep woo /etc/oratabwoo:/DBSoft/oracle/product/19.3/dbhome_1:N[rootadg19c ~]# sed -i s/:N/:Y/ /etc/oratab[rootadg19c ~]# grep woo /etc/oratabwoo:/DBSoft/oracle/product/19.3/dbhome_1:Y二…

调用exe文件(一般处理登陆安全窗口)+睡眠等待(--------------------)

在测试basic认证的时候,处理windows弹窗的问题时,是用autoit进行处理的,最终转成一个.exe文件,然后再用java调用该exe文件。 1、调用自己打包的exe文件(如下下例子) package com.gmsd.gommon; import java.…

LeetCode 2094. 找出 3 位偶数

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 digits ,其中每个元素是一个数字(0 - 9)。数组中可能存在重复元素。 你需要找出 所有 满足下述条件且 互不相同 的整数: 该整数由 digits 中的三个元素按 任意 顺序 依次连接 …

oracle追踪触发器语句,Oracle中怎样通过触发器来追踪用户的活动?

从Oracle8i开始,Oracle引入了特殊的触发器,这些触发器并不是和特殊的DML事件相关联的(DML事件,如,INSERT,UPDATE和DELETE)。这些系统级别的触发器包括数据库启动触发器,DDL触发器和最终用户登陆/注销触发器。当Oracle提…

TotoiseSVN 使用参考文章

SVN使用教程总结 http://www.cnblogs.com/armyfai/p/3985660.html TotoiseSVN的基本使用方法 http://www.cnblogs.com/xilentz/archive/2010/05/06/1728945.html windows svn server and client and plugin的下载地址 https://www.visualsvn.com/downloads/ VisualSVN Server |…

oracle oci.dll的作用,ASP.NET bin目录中的Oracle oci.dll无法删除/不起作用

我按照这里的指示:http://splinter.com.au/blog/?p156尝试使用较新版本的ODP.NET而不安装Oracle 11g客户端.到目前为止,除了重启IIS之外,我都遵循了一切.然而,这引起了一些问题,我真的很好奇为什么.如果我尝试使用ODP.NET,我遇到了Oracle连接尝试连接时抛出的空白异…

POJ 3041 Asteroids (对偶性,二分图匹配)

题目:POJ 3041 Asteroids http://poj.org/problem?id3041 分析: 把位置下标看出一条边,这显然是一个二分图最小顶点覆盖的问题,Hungary就好。 挑战: 输出一组可行解。构造,已知二分图的两个点集U和V&#…

LeetCode 2095. 删除链表的中间节点(快慢指针)

文章目录1. 题目2. 解题1. 题目 给你一个链表的头节点 head 。删除 链表的 中间节点 ,并返回修改后的链表的头节点 head 。 长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点(下标从 0 开始),其中 ⌊x⌋ 表示小于或等于 x…

linux 普通用户间切换,Linux中管理员用户与普通用户之间的切换

jsp页面添加一个集合数组到action(用序列化提交)页面的js //点击a标签增加删除 var i0; $("#a").on("click",function(){ var $newtr $("& ...JS 随机数function GetRandomNum(Min,Max){ var Range Max - Min; var Rand Math.random(); return…

sql 函数 总结

聚合函数 Avg(numeric_expr)返回integer、decimal、money、float---返回组中各值的平均值 Count(*|column_name|distinct column_name) 返回integer---返回表中的记录数|返回指定列的数目|返回指定列的不同值的数目 Count_big(*|column_name|distinct column_name…

LeetCode 2096. 从二叉树一个节点到另一个节点每一步的方向(最小公共祖先)

文章目录1. 题目2. 解题1. 题目 给你一棵 二叉树 的根节点 root ,这棵二叉树总共有 n 个节点。 每个节点的值为 1 到 n 中的一个整数,且互不相同。 给你一个整数 startValue ,表示起点节点 s 的值,和另一个不同的整数 destValue …

linux下实现内存监视,shell脚本来监视Linux上的内存使用情况

shell脚本来监视Linux上的内存使用情况监视所有内容,例如CPU利用率,内存利用率,交换利用率,磁盘空间利用率等等。如果您只有很少的系统并且要监视它们,那么编写一个小的Shell脚本可以使您的任务非常容易。我们添加了两…

大数据的学习历程

大数据scala语言不仅可以在函数中嵌套函数,还可以定义偏函数。 def sum(a :Int,b:Int,c:Int) abcval pld sum _println(pld(1,2,3))println(pld.apply(1, 2, 3))val ped sum(1,_:Int,3)println(ped(2))println(ped.apply(2))val add (x : Int)> x2println(ad…

LeetCode 2097. 合法重新排列数对(欧拉路径)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的二维整数数组 pairs &#xff0c;其中 pairs[i] [starti, endi] 。如果 pairs 的一个重新排列&#xff0c;满足对每一个下标 i &#xff08; 1 < i < pairs.length &#xff09;都有 endi-1 starti &#xff0c…

linux防火墙 33001端口,Linux操作系统下IPTables配置方法详解

如果你的IPTABLES基础知识还不了解,建议先去看看。我们来配置一个filter表的防火墙1、查看本机关于IPTABLES的设置情况[roottp ~]# iptables -L -nChain INPUT (policy ACCEPT)target prot opt source destinationChain FORWARD (policy ACCEPT)target prot opt source destina…

《如何在大学里脱颖而出(How to Win at College)》读书笔记

《如何在大学里脱颖而出(How to Win at College)》读书笔记 图书简介 中文版&#xff1a; 英文版&#xff1a; 作者卡尔纽波特&#xff08;Cal Newport&#xff09;于 2004 年6月以优等生荣誉学会会员身份毕业于达特茅斯学院。曾在《华尔街日报》的学报和《今日商务》等杂志上发…

LeetCode 2099. 找到和最大的长度为 K 的子序列

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums 和一个整数 k 。 你需要找到 nums 中长度为 k 的 子序列 &#xff0c;且这个子序列的 和最大 。 请你返回 任意 一个长度为 k 的整数子序列。 子序列 定义为从一个数组里删除一些元素后&#xff0c;不改变剩下元素的顺…

cms安装教程Linux,DoraCMS安装教程(linux)

最近在熟悉linux环境&#xff0c;也基本上把DoraCMS部署上去了&#xff0c;本教程基于ubuntu server 14.0.4&#xff0c;其它linux版本部署方式基本上差不多&#xff0c;下面详细说明一下&#xff1a;1、进入server环境下&#xff0c;在ubuntu目录下建立文件夹softbak,我们用来…

hdu 2049 考新郎

假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能. 和之前那道题一样&#xff0c;是错排&#xff0c;但是要乘上排列数。 选对的人有C(N,M)个组合&#xff0c;将它们排除掉&#xff0c;剩下的人就是错排了 1 #include<iostream>2 #include…

LeetCode 2100. 适合种地的日子(计数)

文章目录1. 题目2. 解题1. 题目 你和一群强盗准备种地。给你一个下标从 0 开始的整数数组 security &#xff0c;其中 security[i] 是第 i 天 天气热的数量。日子从 0 开始编号。同时给你一个整数 time 。 如果第 i 天满足以下所有条件&#xff0c;我们称它为一个适合种地的日…