美文网首页python-web开发
8、fastApi-使用数据库

8、fastApi-使用数据库

作者: 许忠慧 | 来源:发表于2023-08-03 14:39 被阅读0次

一、安装三方库

pip install sqlalchemy
pip install pymysql

二、创建表

为了更好的实现项目代码管理,可以将数据库操作放到其他文件中进行,而不是全部代码都堆积到main.py

1、根据截图创建对应文件

  • database.py:用于创建可调用的数据库引擎使用
  • models.py:用于定义数据表模型
  • __init__.py: 空文件,表示mysql是一个自定义的库包,可以在其他文件中直接使用import引用到

database.py内容如下:

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

# 定义数据库连接的url
# 格式: 数据库类型+数据库驱动://用户名:密码@Ip:端口/数据库名
# 注意:数据库需要先前置创建好,不会自动创建数据库
SQLALCHEMY_DATABASE_URL = "mysql+pymysql://root:123456@127.0.0.1:3306/fastapi_data"

# 使用url创建一个数据库引擎
engine = create_engine(SQLALCHEMY_DATABASE_URL)

# 创建数据库库会话
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 返回一个base基类,用于继承
Base = declarative_base()

models.py内容如下:

from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship

from .database import Base


# 数据库模型
class User(Base):
    # 创建一个名为users的表
    __tablename__ = "users"

    # 字段
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String(20))

main.py内容如下:

from fastapi import FastAPI
from mysql import models, database

app = FastAPI()


@app.get("/")
def root():
    # 创建数据表
    models.Base.metadata.create_all(bind=database.engine)
    return {"create table success"}

然后启动服务,浏览器访问root节点

2、验证数据库是否创建成功

然后使用下述命令查表是否创建成功

# 连接数据库,会车后需要输入root用户密码再回车才能连上数据库
mysql -uroot -p
# 显示出当前有哪些库
show databases;
# 使用 fastApiData 库
use fastapi_data;
# 查看数据库下有哪些表
show tables;
# 查看users表下有哪些字段
show Columns from users;

当然,也可以使用一些可视化的数据库查看工具去查看,省去命令记忆

三、增删改查

在之前的基础上对main.py进行如下修改:

from fastapi import FastAPI, Depends
from mysql import models, database

app = FastAPI()


# 创建数据库表
@app.get("/")
def root():
    # 创建数据表
    models.Base.metadata.create_all(bind=database.engine)
    return {"create table success"}


# 新增数据, 这里为了演示用的get请求,一般用post
@app.get('/add/{userName}')
def add_user(userName):
    userInfo = models.User(name=userName)  # 创建新增实例
    db = database.SessionLocal()  # 获取数据库会话
    db.add(userInfo)  # 新增
    db.commit()  # 提交
    db.refresh(userInfo)  # 刷新数据
    return f"数据库新增数据成功, 用户名: {userName}"


# 查询数据
@app.get('/search/{searchParm}')
def search_data(searchParm):
    db = database.SessionLocal()  # 获取数据库会话
    if searchParm == 'all':
        users = db.query(models.User).all()  # 查看所有用户
        return users
    else:
        user = db.query(models.User).filter(models.User.id == int(searchParm)).first()  # 使用过滤条件查看单个用户
        return user


# 修改数据,这里为了演示用了get请求,一般用put
@app.get('/modify/{oldName}&{newName}')
def modify_data(oldName, newName):
    db = database.SessionLocal()  # 获取数据库会话
    existing_user = db.query(models.User).filter(models.User.name == oldName).first()
    existing_user.name = newName
    db.commit()
    db.refresh(existing_user)
    return existing_user


# 删除数据,这边为了演示用了get请求,一般用delete
@app.get('/delete/{userName}')
def delete_data(userName):
    db = database.SessionLocal()  # 获取数据库会话
    db.query(models.User).filter(models.User.name == userName).delete()
    db.commit()
    return f"名为: {userName} 的用户已经被删除"

相关文章

  • MySQL使用总结

    数据库 - 创建数据库 - create database 数据库名称 charset=utf8; - 使用数...

  • 测试markdown

    # 数据库建模说明 数据库使用:Postgresql 数据库统一使用字符集: UTF-8 ## 1. User 用...

  • 第2周总结

    1 MySQL 的 utf-8 MySQL 数据库的 utf-8 编码数据读取:MySQL 如果数据库创建时使用了...

  • MySQL开发规范

    一、基础规范 1) 使用InnoDB存储引擎 2) 数据库字符集使用UTF8,校对字符集使用utf8_gene...

  • CSAA PRACTICE TEST 7

    CSAA PRACTICE TEST 7 8 1. 使用数据库备份: Amazon RDS 创建并保存数据库实例...

  • MYSQL须知

    执行: 1.创建数据库 create database 库名 charset=utf8; 2.使用数据库 use ...

  • 2019-02-11 问题记录

    一、 数据库异常:Public Key Retrieval is not allowed 在使用 MySQL 8....

  • java.sql.SQLException: Unknown i

    问题描述: 使用mysql8.+版本,使用myeclipse连接数据库时总报Unknown initial cha...

  • MySQL 基础之数据库和表管理

    一、数据库管理 创建库时指定字符集(utf-8, gb2312) Example 使用数据库 Example 查看...

  • cmd命令行设置代码页

    背景 在使用CMD命令行连接MySQL数据库时,查询出来的中文数据显示乱码。后来发现是服务器数据库使用utf8编码...

网友评论

    本文标题:8、fastApi-使用数据库

    本文链接:https://www.haomeiwen.com/subject/pmljpdtx.html