fastapi: python web入门链接数据库及基本操作

237 阅读2分钟

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右上角按钮即可

image.png

image.png

运行起来之后浏览器输入http://127.0.0.1:5000/users/ 或者http://127.0.0.1:5000/users/1 返回数据库对应数据即成功

image.png

image.png