fastapi搭建平台实战教程一:SQLAlchemy生成数据库数据

发布时间 2023-10-31 23:03:00作者: 进肛葫芦娃

除了falsk,SQLAlchemy也能很好的支持fastapi框架。

首先创建一个main.py

from fastapi import FastAPI

app = FastAPI()

@app.post("/register")
def register():
    ...

@app.post("/login")
def login():
    ...

配置数据库

创建db.py,初始化数据库连接对象

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "mysql+pymysql://root:@localhost:3306/fastapi1?charset=utf8mb4"
# SQLALCHEMY_DATABASE_URL = "postgresql://user:password@postgresserver/db"

#创建一个 SQLAlchemy的“引擎”
engine = create_engine(
    SQLALCHEMY_DATABASE_URL
)

#我们创建了一个SessionLocal类的实例,这个实例将是实际的数据库会话。sessionmaker是sqlalchemy2.0的使用方式,1.4要使用Session(engine)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

#我们将用这个类继承,来创建每个数据库模型或类(ORM 模型)
Base = declarative_base()

创建models.py,创建数据库模型

from sqlalchemy import Boolean, Column, ForeignKey, Integer, String,DateTime

from db import Base

class Group(Base):
    __tablename__ = 'group'

    id = Column(Integer, primary_key=True)
    # : name of group
    # : 权限组名称
    name = Column(String(60), comment="权限组名称")
    # a description of a group
    # 权限组描述
    info = Column(String(255), comment="权限组描述")


class User(Base):
    __tablename__ = "user" # 数据库表名
    id = Column(Integer,primary_key=True)
    username = Column(String(24), nullable=False, unique=True, comment="昵称")
    password = Column(String(500), nullable=False, comment="密码")
    nickname = Column(String(100),nullable=True, comment="用户姓名")
    email = Column(String(100), nullable=True,  comment="电子邮箱")
    isadmin = Column(Boolean,default=False,comment="管理员")

class Auth(Base):
    __tablename__ = 'auth'

    id = Column(Integer, primary_key=True)
    # : 权限字段
    auth = Column(String(60), comment="权限字段")
    # : 权限的模块
    endpoint = Column(String(60), comment="路由名称")

在main.py中加入自动创建数据库的语句

import models
from db import engine

models.Base.metadata.create_all(bind=engine)

uvicorn main:app --reload启动就回自动创建数据库了。

models.py创建一个所有表文件的父类,加入创建时间、创建人等基本字段,并将之前表的父类改为InfoCrud

class InfoCrud(Base):
    __abstract__ = True # 作为父类使用,并且不在数据库生成此表
    _create_time = Column('create_time', DateTime, default=datetime.now)
    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now)
    delete_time = Column(DateTime)
    update_user_id = Column(Integer, nullable=True)
    create_user_id = Column(Integer, nullable=True)
    update_user_name = Column(String(50), nullable=True)
    create_user_name = Column(String(50), nullable=True)

class User(InfoCrud):

再次运行,查看数据库可以看到新的父类未生效说明不能更新表结构,只能删除表重建,重建后可以新增父类的字段。