fastapi项目 02-数据库SqlAlchemy

发布时间 2023-12-27 00:03:58作者: dack_deng

1. fastapi连接数据库

在app目录下,新建database.py文件,在这里实现数据的连接。

# app/database.py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import declarative_base

# 为 SQLAlchemy 定义数据库 URL地址
SQLALCHEMY_DATABASE_URL = 'mysql+pymysql://root:12345678@127.0.0.1:3306/fastapi_v1'

# 创建 SQLAlchemy 引擎
engine = create_engine(SQLALCHEMY_DATABASE_URL)
# 创建一个SessionLocal 数据库会话
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 创建一个Model类
DbModel = declarative_base()

1.1 创建数据库模型

在app文件下,新建model/models.py文件创建数据库模型。并且将使用我们之前创建的DbModel类来创建SQLAlchemy模型。

from apps.database import DbModel
from sqlalchemy import Column, String, Boolean, Integer

class User(DbModel):
    __tablename__ = 'user'  # 数据库表名

    id = Column(Integer, primary_key=True, autoincrement=True)
    username = Column(String(50), unique=True, nullable=False)  # nullable=fasle:必填
    password = Column(String(256), nullable=False)
    is_active = Column(Boolean, default=1)
    email = Column(String(64), nullable=True)
    adress = Column(String(64), nullable=True)

2. SqlAlchemy表迁移-alembic

首先需要安装alembic:> pip install alembic ,如果报超时,则需添加如下:-i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn
安装完了之后,需要生成初始化文件,想项目根目录下执行:alembic init alembic,可以看到目录下新增alembic的文件和一个alembic.ini文件。

alembic/  
|____version/     // 一个空的文件夹,保存迁移中间文件  
|____env.py       // 迁移配置文件 (主要设置文件)  
|____script.py.mako  
|____READEME       // 配置文件  
alembic.ini       // alembic 自动生成的迁移配置文件  
app/              // 项目文件夹

2.1 修改alembic配置文件(alembic.ini)

找到sqlalchemy.url改成自己的配置,在该文件下的第63行。

;sqlalchemy.url = driver://user:pass@localhost/dbname. # 改成下面的,自己的数据库配置信息
sqlalchemy.url = mysql+pymysql://root:12345678@127.0.0.1:3306/fastapi_v1

2.2 # 配置alembic/env.py文件

在该文件夹的19,20,21行,替换如下代码,自己的数据库DbModel

# target_metadata = None 找到这,并替换以下内容
from app.models import DbModel   #

target_metadata = DbModel.metadata

执行迁移命令:

alembic revision --autogenerate -m "test" # 自定义迁移文件名
alembic upgrade head

就可以在mysql客户端中,查看到创建的表已经添加到数据库中了。

如果能在接口中,讲数据添加到数据库中,还需要在app下新建数据库session会话,我们写在dependency.py下。

# app/dependency
from apps.database import SessionLocal

# Dependency
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

在view函数中,添加如下注册接口。

from fastapi import APIRouter, Depends
from pydantic import BaseModel
from sqlalchemy.orm import Session
from apps.dependency import get_db
from apps.model.models import User

router = APIRouter()

class UserInfo(BaseModel):
    username: str
    password: str

@router.post("/login")
async def login_demo():
    return {"msg": "login success!"}


@router.post("/register")
async def register_demo(body: UserInfo, db: Session = Depends(get_db)):
    # db的实例
    print(f"请求body:{body}")
    user = User(**body.dict())
    db.add(user)
    db.commit()
    db.refresh(user)
    return {"msg": "register success!"}

运行mian.py函数。执行注册接口,新增数据到数据库成功。