fastapi入门最后一篇,以下以项目实践为主啦!!!
下面以SQLAlchemy为例(网上有很多可自行查找,这是我参考的
什么是SQLAlchemy?
SQLAlchemy是Python SQL工具包和对象关系映射器,是python中最著名的ORM(Object Relationship Mapping)框架,它简化了应用程序开发人员在原生SQL上的操作,使开发人员将主要精力都放在程序逻辑上,从而提高开发效率。它提供了一整套著名的企业级持久性模式,设计用于高效和高性能的数据库访问。
使用ORM操作数据库:
优势 :代码易读,隐藏底层原生SQL语句,提高了开发效率。
劣势 :执行效率低 ,将方法转换为原生SQL后 原生SQL不一定是最优的
下载安装mysql免费机票
不再多说,自行查找安装方法
fastapi安装SQLAlchemy
pip install SQLAlchemy
创建users表模型
利用 SQLAlchemy 创建 Users 的模型,在 model.py 中写入如下的代码:
from sqlalchemy import Column, TEXT, BIGINT, DATETIME
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(BIGINT, autoincrement=True, primary_key=True)
name = Column(TEXT, nullable=False)
created_at = Column(DATETIME, nullable=False)
declarative_base() 创建映射关系
链接mysql数据库
在 db.py 中写入以下代码:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
# DB_URL = 'mysql+pymysql://{USERNAME}:{PASSWORD}@{PORT}/{DBNAME}'
MYSQL_URL = 'mysql+pymysql://root:root@localhost:3306/example_db?charset=utf8'
POOL_SIZE = 20
POOL_RECYCLE = 3600
POOL_TIMEOUT = 15
MAX_OVERFLOW = 2
class Database():
def __init__(self) -> None:
self.connection_is_active = False
self.engine = None
def get_db_connection(self):
if self.connection_is_active == False:
try:
self.engine = create_engine(MYSQL_URL,
pool_size=POOL_SIZE,
pool_recycle=POOL_RECYCLE,
pool_timeout=POOL_TIMEOUT,
max_overflow=MAX_OVERFLOW)
return self.engine
except Exception as e:
print("Error connecting to MySQL DB:", e)
return self.engine
def get_db_session(self, engine):
try:
Session = sessionmaker(bind=engine)
session = Session()
return session
except Exception as e:
print("Error getting DB session:", e)
return None
创建users API 在 users.py 中写入以下代码:
from fastapi import APIRouter
from sqlalchemy import and_
from db import Database
from model import User
router = APIRouter(
prefix="/users",
tags=["User"],
)
database = Database()
engine = database.get_db_connection()
@router.get("/")
async def read_all_users():
session = database.get_db_session(engine)
data = session.query(User).all()
return data
@router.get('/{user_id}')
async def get_user(user_id: int):
session = database.get_db_session(engine)
data = None
try:
data = session.query(User).filter(
and_(User.id == user_id)).one()
except Exception as ex:
print("Error:", ex)
error = False
return data
创建路由 在 main.py 中写入以下代码:
from fastapi import FastAPI
from users import router
import uvicorn
app = FastAPI()
app.include_router(router)
if __name__ == "__main__":
uvicorn.run(app="main:app", host="0.0.0.0", port=5000, log_level="info", reload=True)
运行main.py文件
点击vscode右上角按钮即可
运行起来之后浏览器输入http://127.0.0.1:5000/users/ 或者http://127.0.0.1:5000/users/1 返回数据库对应数据即成功