日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

FastAPI 结合 SQLAlchemy 操作 MySQL 数据库

發布時間:2024/7/5 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)

總結

以上是生活随笔為你收集整理的FastAPI 结合 SQLAlchemy 操作 MySQL 数据库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。