如何使用fastapi创建数据库
时间: 2024-06-07 16:04:38 浏览: 253
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API 和基于 Python 3.6+ 的异步 Web 应用。接下来,我将简要介绍如何使用 FastAPI 创建并操作数据库:
1. **选择数据库**:FastAPI 支持多种关系型数据库,包括但不限于 SQLite、PostgreSQL、MySQL、Oracle 以及 Microsoft SQL Server。根据你的项目需求选择合适的数据库。
2. **安装必要包**:确保你已经安装了 FastAPI 和 SQLAlchemy(一个流行的 ORM 框架),以及其他必需的包,如 `uvicorn`。
3. **创建数据模型**:使用 SQLAlchemy,你可以通过定义类来创建数据模型。这些类将映射到数据库中的表,类的属性对应表中的字段。
4. **配置数据库**:在 FastAPI 应用中创建一个配置文件,设置数据库的 URL 和其他相关配置。
5. **集成数据库到应用**:通过 `database.py` 文件初始化你的数据库,并在应用中使用依赖注入来管理数据库会话。
6. **实现CRUD操作**:在 FastAPI 应用中,你可以使用路由装饰器和依赖注入来轻松实现对数据库的基本 CRUD(创建、读取、更新、删除)操作。
7. **运行和测试**:启动你的 FastAPI 应用,使用 Postman 或其他 API 测试工具来测试你的数据库端点。
相关问题
fastapi 新增数据库接口
### 如何在 FastAPI 中新增数据库接口的最佳实践
#### 1. 安装依赖库
为了使 FastAPI 应用程序能够连接并操作数据库,通常需要安装相应的 ORM 或者驱动工具。SQLAlchemy 是一种常用的 Python SQL 工具包和对象关系映射器 (ORM),可以很好地与 FastAPI 集成。
```bash
pip install fastapi sqlalchemy databases uvicorn
```
#### 2. 创建项目结构
合理的文件夹布局有助于维护项目的清晰度:
```
project/
│
├── app/
│ ├── __init__.py
│ ├── main.py # 主应用入口
│ ├── models.py # 数据库模型定义
│ ├── schemas.py # Pydantic 模型验证
│ └── crud.py # CRUD 操作逻辑封装
└── alembic/ # 数据库迁移配置(可选)
└── ...
```
#### 3. 初始化 SQLAlchemy 和 Databases 实例
`main.py` 文件中初始化必要的组件来管理数据库会话以及异步查询支持。
```python
from typing import AsyncGenerator, Generator
import databases
import sqlalchemy
from fastapi import Depends, FastAPI
from pydantic import BaseModel
DATABASE_URL = "sqlite:///./test.db"
database = databases.Database(DATABASE_URL)
metadata = sqlalchemy.MetaData()
engine = sqlalchemy.create_engine(
DATABASE_URL,
connect_args={"check_same_thread": False}
)
def get_db() -> Generator:
try:
yield database
finally:
pass
app = FastAPI()
@app.on_event("startup")
async def startup():
await database.connect()
@app.on_event("shutdown")
async def shutdown():
await database.disconnect()
```
#### 4. 定义数据表模式
通过 `models.py` 来描述实体类及其字段属性,并将其映射到实际的关系型表格上。
```python
from sqlalchemy import Column, Integer, String, Table, ForeignKey
from .main import metadata
users_table = Table(
'users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(50)),
Column('email', String(100))
)
```
#### 5. 构建 API 请求体校验规则
`schemas.py` 使用 Pydantic 提供的数据解析功能确保传入参数的有效性和一致性。
```python
from pydantic import BaseModel, EmailStr
class UserCreate(BaseModel):
name: str
email: EmailStr
class UserRead(UserCreate):
id: int
class Config:
orm_mode = True
```
#### 6. 封装基本增删改查函数
`crud.py` 负责处理具体的业务流程,比如插入新纪录、检索现有条目等。
```python
from sqlalchemy.sql import select
from sqlalchemy.engine.base import Connection
from .schemas import UserCreate
from .models import users_table
async def create_user(conn: Connection, user: UserCreate) -> dict:
query = users_table.insert().values(**user.dict())
result = await conn.execute(query)
return {**user.dict(), "id": result.lastrowid}
async def read_users(conn: Connection) -> list[dict]:
query = select([users_table])
results = await conn.fetch_all(query=query)
return [{column: value for column, value in row.items()} for row in results]
```
#### 7. 设计 RESTful 接口路由
最后,在 `main.py` 添加路径处理器完成对外服务暴露。
```python
from fastapi import HTTPException
from starlette.status import HTTP_404_NOT_FOUND
from .crud import create_user, read_users
from .schemas import UserCreate, UserRead
@app.post("/users/", response_model=UserRead)
async def post_create_user(user: UserCreate, db=Depends(get_db)):
new_user = await create_user(db, user=user)
return new_user
@app.get("/users/")
async def get_read_users(db=Depends(get_db)):
all_users = await read_users(db)
if not all_users:
raise HTTPException(status_code=HTTP_404_NOT_FOUND, detail="No Users Found.")
return {"data": all_users}
```
上述过程展示了如何构建一个简单的 FastAPI Web Service 并集成 SQLite 数据库存储能力[^1]。当然,具体实现细节可能因所选用的不同类型的数据库而有所差异;此外,考虑到生产环境下的性能优化需求,还可以引入诸如缓存机制、分页加载等功能特性进一步增强系统的健壮性。
如何使用fastapi创建前端登录界面实现连接数据库
FastAPI是一个现代、快速的Web框架,用于构建 APIs。为了创建前端登录界面并将其与数据库相连,你需要遵循以下步骤:
1. **安装所需库**:
- 使用`pip`安装`FastAPI`、`Uvicorn`作为服务器,以及数据库库如`SQLAlchemy`(配合`alembic`做版本控制),还有`Passlib`处理密码哈希。
```bash
pip install fastapi uvicorn sqlalchemy alembic passlib[bcrypt]
```
2. **设置项目结构**:
创建`main.py`, `models.py`, `schemas.py`, 和 `database.py`等文件分别用于定义API路由、数据模型、请求和响应验证。
3. **`models.py`:**
定义用户模型,包含用户名和加密后的密码字段。
```python
from sqlalchemy import Column, String
from .base import Base
class User(Base):
__tablename__ = "users"
id = Column(String, primary_key=True)
username = Column(String, unique=True, nullable=False)
hashed_password = Column(String, nullable=False)
```
4. **`schemas.py`:**
创建User schema,用于序列化和反序列化JSON数据。
```python
from pydantic import BaseModel
from typing import Optional
class UserCreate(BaseModel):
username: str
password: str
class UserInDB(User):
id: str
```
5. **`database.py`:**
配置数据库连接和迁移工具。
```python
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from .base import Base
engine = create_engine("sqlite:///./app.db", echo=True) # 示例:SQLite
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
```
6. **`main.py`:**
在这里编写FastAPI应用,添加登录路由,并处理登录逻辑(包括从数据库查找用户和验证密码)。
```python
from fastapi import FastAPI, Depends, HTTPException, status
from starlette.requests import Request
from . import database, schemas
from passlib.context import CryptContext
app = FastAPI()
crypt_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
async def get_db(request: Request):
db = await database.get_db()
request.state.db = db
return db
@app.post("/login", response_model=schemas.UserInDB)
async def login(user_in: schemas.UserCreate, db: Depends(get_db)):
user = db.query(User).filter_by(username=user_in.username).first()
if not user or not crypt_context.verify(user.hashed_password, user_in.password):
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid credentials")
return user
```
7. **前端部分**:
使用HTML、CSS和JavaScript创建登录表单,通过Ajax发送POST请求到/api/login。可以使用React、Vue.js等前端框架。
8. **部署**:
使用Uvicorn启动服务:`uvicorn main:app --reload`,然后在浏览器访问登录页面尝试登录。
阅读全文