FastAPI(44)- 操作关系型数据库(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: FastAPI(44)- 操作关系型数据库(上)

ORM


  • FastAPI 可与任何数据库和任何样式的库配合使用并和数据库通信
  • object-relational mapping 对象关系映射
  • ORM 具有在代码和数据库表(关系)中的对象之间进行转换(映射)的工具
  • 使用 ORM,通常会创建一个表示 SQL 数据表的类,该类的每个属性都表示一个列,具有名称和类型

 

小栗子

  • Pet 类可以表示 SQL 表 pets
  • 并且 Pet 类的每个实例对象代表数据库中的一行数据
  • 例如,对象 orion_cat(Pet 的一个实例)可以具有属性 orion_cat.type,用于列类型,属性的值可以是:猫

 

项目架构


.
└── sql_app
    ├── __init__.py
    ├── curd.py
    ├── database.py
    ├── main.py
    ├── models.py
    └── schemas.py


前提


需要先安装 sqlalchemy

pip install sqlalchemy

 

使用 sqlite

  • 后面的栗子,暂时跟着官网,先使用 sqlite 数据库来演示
  • 后面有时候再通过 Mysql 来写多一篇文章

 

database.py 代码


# 1、导入 sqlalchemy 部分的包
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 2、声明 database url
SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"
# SQLALCHEMY_DATABASE_URL = "postgresql://user:password@postgresserver/db"
# 3、创建 sqlalchemy 引擎
engine = create_engine(
    url=SQLALCHEMY_DATABASE_URL,
    connect_args={"check_same_thread": False}
)
# 4、创建一个 database 会话
session = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 5、返回一个 ORM Model
Base = declarative_base()


声明 database 连接 url

SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"

# SQLALCHEMY_DATABASE_URL = "postgresql://user:password@postgresserver/db"

第一行是 slite 连接 url

 

其他数据库连接 url 的写法

# sqlite-pysqlite 库
sqlite+pysqlite:///file_path
# mysql-mysqldb 库
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
# mysql-pymysql 库
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
# mysql-mysqlconnector 库
mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
# oracle-cx_Oracle 库
oracle+cx_oracle://user:pass@hostname:port[/dbname][?service_name=<service>[&key=value&key=value...]]
# postgresql-pypostgresql 库
postgresql+pypostgresql://user:password@host:port/dbname[?key=value&key=value...]
# SQL Server-PyODBC 库
mssql+pyodbc://<username>:<password>@<dsnname>


创建一个数据库引擎

engine = create_engine(

   url=SQLALCHEMY_DATABASE_URL,

   connect_args={"check_same_thread": False}

)

  • {"check_same_thread": False} 仅适用于 SQlite,其他数据库不需要用到
  • 默认情况下,SQLite 将只允许一个线程与其通信,假设每个线程只处理一个独立的请求
  • 这是为了防止被不同的事物(对于不同的请求)共享相同的连接
  • 但是在 FastAPI 中,使用普通函数 (def) 可以针对同一请求与数据库的多个线程进行交互,因此需要让 SQLite 知道它应该允许使用多线程
  • 需要确保每个请求在依赖项中都有自己的数据库连接会话,因此不需要设置为同一个线程

 

创建一个数据库会话

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

  • SessionLocal 类的每个实例都是一个数据库会话
  • 但 sessionmaker 本身还不是数据库会话
  • 但是一旦创建了 SessionLocal 类的实例,这个实例就会成为实际的数据库会话
  • 将其命名为 SessionLocal ,方便区分从 SQLAlchemy 导入的 Session
  • 稍后将使用 Session(从 SQLAlchemy 导入的那个)

 

创建一个 ORM 模型基类

Base = declarative_base()

后面会通过继承这个 Base 类,来创建每个数据库 Model,也称为 ORM Model

 

models.py 代码


from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship
from .database import Base
class User(Base):
    # 1、表名
    __tablename__ = "users"
    # 2、类属性,每一个都代表数据表中的一列
    # Column 就是列的意思
    # Integer、String、Boolean 就是数据表中,列的类型
    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    email = Column(String, unique=True, index=True)
    hashed_password = Column(String)
    is_active = Column(Boolean, default=True)
    items = relationship("Item", back_populates="owner")
class Item(Base):
    __tablename__ = "items"
    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    title = Column(String, index=True)
    description = Column(String, index=True)
    owner_id = Column(Integer, ForeignKey("users.id"))
    owner = relationship("User", back_populates="items")


注意:有 autoincrement 就不要用 default 了哈

 

Column

列,一个属性代表数据表中的一列

 

常用参数

参数 作用
primary_key 如果设为 True ,这列就是表的主键
unique 如果设为 True ,这列不允许出现重复的值
index 如果设为 True ,为这列创建索引,提升查询效率
nullable
  • 如果设为 True ,这列允许使用空值;
  • 如果设为 False ,这列不允许使用空值
default 为这列定义默认值

autoincrement

如果设为 True ,这列自增

 

String、Integer、Boolean

代表数据表中每一列的数据类型

 

schemas.py 代码


背景

为了避免混淆 SQLAlchemy 模型和 Pydantic 模型之间,将使用文件 models.py 编写 SQLAlchemy 模型和文件 schemas.py 编写 Pydantic 模型

 

实际代码

from typing import List, Optional
from pydantic import BaseModel
# Item 的基类,表示创建和查询 Item 时共有的属性
class ItemBase(BaseModel):
    title: str
    description: Optional[str] = None
# 创建 Item 时的 Model
class ItemCreate(ItemBase):
    pass
# 查询 Item 时的 Model
class Item(ItemBase):
    id: int
    owner_id: int
    # 向 Pydantic 提供配置
    class Config:
        #  orm_mode 会告诉 Pydantic 模型读取数据,即使它不是字典,而是 ORM 模型(或任何其他具有属性的任意对象)
        orm_mode = True
class UserBase(BaseModel):
    email: str
class UserCreate(UserBase):
    password: str
class User(UserBase):
    id: int
    is_active: bool
    items: List[Item] = []
    class Config:
        orm_mode = True
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
7月前
|
关系型数据库 MySQL 分布式数据库
PolarDB操作报错合集之在执行语句时遇到语法错误,是由什么导致的
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
103 1
|
7月前
|
SQL 关系型数据库 分布式数据库
PolarDB操作报错合集之在调用ModifySecurityIps修改白名单时遇到错误码,是什么导致的
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
|
7月前
|
关系型数据库 MySQL 分布式数据库
PolarDB操作报错合集之在进行批量导出数据时,如何过滤掉视图并只导出表
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
100 0
|
5月前
|
安全 关系型数据库 数据库
FastAPI数据库操作秘籍:如何通过高效且安全的数据库访问策略,使你的Web应用飞速运转并保持数据完整性?
【8月更文挑战第31天】在构建现代Web应用时,数据库操作至关重要。FastAPI不仅简化了API创建,还提供了高效数据库交互的方法。本文探讨如何在FastAPI中实现快速、安全的数据处理。FastAPI支持多种数据库,如SQLite、PostgreSQL和MySQL;选择合适的数据库可显著提升性能。通过安装相应驱动并配置连接参数,结合ORM库(如Tortoise-ORM或SQLAlchemy),可以简化数据库操作。使用索引、批量操作及异步处理等最佳实践可进一步提高效率。同时,确保使用参数化查询防止SQL注入,并从环境变量中读取敏感信息以增强安全性。
262 1
|
6月前
|
Oracle 关系型数据库 数据库
|
6月前
|
消息中间件 关系型数据库 数据库
实时计算 Flink版操作报错合集之在使用RDS数据库作为源端,遇到只能同步21个任务,是什么导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
6月前
|
SQL 存储 关系型数据库
|
7月前
|
运维 关系型数据库 分布式数据库
PolarDB产品使用问题之RENAME TABLE操作的速度与表的大小是否有关
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
7月前
|
网络协议 关系型数据库 分布式数据库
PolarDB操作报错合集之Quartz+polardb去执行定时任务报错,该怎么办
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
|
7月前
|
关系型数据库 MySQL 分布式数据库
PolarDB操作报错合集之遇到报错:Nested transactions are not supported,该怎么办
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
136 1