fastapi搭建平台实战教程一:生成数据库数据
除了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):
再次运行,查看数据库可以看到新的父类未生效说明不能更新表结构,只能删除表重建,重建后可以新增父类的字段。