2.FastAPI+SQLAlchemy

2 阅读1分钟

ORM sqlAlchemy

更新pip

python -m pip install --upgrade pip -i mirrors.aliyun.com/pypi/simple…

先安装预编译的 greenlet(不进行源码编译)

pip install greenlet --only-binary :all: -i mirrors.aliyun.com/pypi/simple…

如果上面成功,再安装 sqlalchemy[asyncio] 和 aiomysql异步mysql驱动

pip install "sqlalchemy[asyncio]" aiomysql -i mirrors.aliyun.com/pypi/simple…

下载包文件wheel

pip download 'sqlalchemy[asyncio]' aiomysql -d ./

安装wheel包

pip install --no-index --find-links=./package 'sqlalchemy[asyncio]' aiomysql

from datetime import datetime

import uvicorn
from fastapi import FastAPI
from sqlalchemy import DateTime, func, String, Float

from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column


ASYNC_DATABASE_URL = "mysql+aiomysql://root:123456@192.168.2.98:3306/fastapi_test?charset=utf8"

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}


@app.get("/hello/{name}")
async def say_hello(name: str):
    return {"message": f"Hello {name}"}

async_engine = create_async_engine(
    ASYNC_DATABASE_URL,
    echo=True,
    pool_size=10,
    max_overflow=20
)


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, onupdate=func.now, comment="更新时间")


class Book(Base):
    __tablename__ = "book"
    id: Mapped[int] = mapped_column(primary_key=True, comment="书籍id")
    bookname: Mapped[str] = mapped_column(String(255))
    author: Mapped[str] = mapped_column(String(255))
    price: Mapped[float] = mapped_column(Float)
    publisher: Mapped[str] = mapped_column(String(255))


async def create_tables():
    async with async_engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)


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


if __name__ == '__main__':
    uvicorn.run(
        "main:app",
        host="0.0.0.0",
        port=8000,
        reload=True,  # 开发模式自动重载
        log_level="debug"
    )