ORM简介、安装、使用流程

目录

一.ORM简介

1.什么是ORM?

2.名字的由来

3.ORM的优势

二.python都支持哪些ORM工具?

[三.SQLAlchemy ORM使用流程](#三.SQLAlchemy ORM使用流程)

1.安装

2.建库

3.建表

①创建数据库引擎

②定义模型类

③启动应用(项目)时,进行建表操作

4.启动项目,查看数据库是否多出一张名为book的表

5.在路由中使用ORM

①导入async_sessionmaker,AsyncSession

②创建异步会话工厂

③定义依赖函数,用于获取数据库会话

④编写接口

⑤测试效果


一.ORM简介

1.什么是ORM?

ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,它允许开发者使用面向对象的编程语言来操作关系型数据库,而不需要直接编写SQL语句。

2.名字的由来

O = Object (对象),指的是python对象
R = Relational (关系的),指的是关系型数据库
M = Mapping(映射),将上面两者(O和R)建立起映射。

连起来就是:对象-关系-映射

3.ORM的优势

  • 减少重复的sql代码
  • 代码更简洁易读
  • 自动处理数据库连接和事务
  • 自动防止SQL注入攻击

二.python都支持哪些ORM工具?

三.SQLAlchemy ORM使用流程

1.安装

打开pycharm终端(控制台),输入以下命令:

bash 复制代码
pip install sqlalchemy[asyncio] aiomysql

2.建库

我们此处建数据库,还是用sql/数据库管理工具的形式吧,比较方便。

3.建表

①创建数据库引擎

注意:数据库的url,要根据自己的实际情况进行填写。

②定义模型类

然后编写如下代码

python 复制代码
# 二.定义模型类:基类 + 表对应的模型类
# 1.定义基类
class Base(DeclarativeBase):
    create_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now(), comment="创建时间")
    update_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now(), onupdate=func.now(), comment="修改时间")

# 2.定义表对应的模型类(此时我们要创建【书籍表】)
class Book(Base):
    # 定义表名
    __tablename__ = "book"
    # 定义字段
    id: Mapped[int] = mapped_column(primary_key=True, comment="书籍id")
    name: Mapped[str] = mapped_column(String(100), nullable=False, comment="书籍名称")
    author: Mapped[str] = mapped_column(String(50), nullable=False, comment="作者")
    price: Mapped[float] = mapped_column(Float, nullable=False, comment="价格")
    publish_time: Mapped[datetime] = mapped_column(DateTime, nullable=False, comment="出版时间")
    update_time: Mapped[datetime] = mapped_column(DateTime, nullable=True, comment="更新时间")

注意:上述导包,如下图所示,别导错

③启动应用(项目)时,进行建表操作

python 复制代码
# 三.定义函数建表(在fastAPI项目启动时,会触发建表)
async def create_tables():
    # 获取异步引擎,创建事务来建表
    async with async_engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all) # Base模型类的元数据创建

@app.on_event("startup")
async def startup_event():
    await create_tables()

4.启动项目,查看数据库是否多出一张名为book的表

5.在路由中使用ORM

①导入async_sessionmaker,AsyncSession

②创建异步会话工厂

python 复制代码
AsyncSessionLocal = async_sessionmaker(
    bind=async_engine,#这个数据库引擎,就是上面自定义的那个
    class_=AsyncSession, #指定会话类
    expire_on_commit=False #提交后会话不过期,不会重新查询数据库
)

③定义依赖函数,用于获取数据库会话

python 复制代码
async def get_database():
    async with AsyncSessionLocal() as session:
        try:
            yield session
            await session.commit()
        except Exception:
            await session.rollback()
            raise
        finally:
            await session.close()

④编写接口

这里用到了一个ORM的查询(select),后面会讲到。

python 复制代码
@app.get("/book/books")
async def get_book_list(db: AsyncSession = Depends(get_database)):
    # 查询book表的全部行
    result = await db.execute(select(Book))
    books = result.scalars().all()
    return books

⑤测试效果

手动往数据库的book表,插入一行数据,否则一会看不出来效果。

可见此时成功查出了数据。

以上就是本篇文章的全部内容,喜欢的话可以留个免费的关注呦~~~

相关推荐
带娃的IT创业者14 小时前
WeClaw WebSocket 连接中断诊断:从频繁掉线到稳定长连的优化之路
python·websocket·网络协议·php·fastapi·实时通信
龙腾AI白云17 小时前
数字孪生国内外发展现状
数据分析·flask·virtualenv·fastapi
小庄梦蝶20 小时前
使用fastapi搭建博客
fastapi
interception1 天前
FastAPI中路径参数,查询参数,请求体参数之间的区别
fastapi
带娃的IT创业者1 天前
WeClaw 离线消息队列实战:异步任务队列如何保证在服务器宕机时不丢失任何一条 AI 回复?
运维·服务器·人工智能·python·websocket·fastapi·实时通信
龙腾AI白云2 天前
数字孪生底层逻辑和技术
深度学习·django·flask·fastapi·tornado
理性的曜2 天前
VoloData——基于LangChain的智能数据分析系统
人工智能·vscode·数据分析·npm·reactjs·fastapi·ai应用
带娃的IT创业者2 天前
Weclaw 请求路由实战:一个 request_id 如何在 800 个并发连接中精准找到目标浏览器?
python·websocket·fastapi·架构设计·实时通信·openclaw·weclaw
带娃的IT创业者3 天前
WeClaw 心跳与重连实战:指数退避算法如何让 WebSocket 在弱网环境下的连接成功率提升 67%?
python·websocket·网络协议·算法·fastapi·实时通信
理性的曜3 天前
AI语音通话系统设计思路:从语音输入到智能回复
人工智能·python·websocket·fastapi