增加docker文件
This commit is contained in:
@@ -0,0 +1,20 @@
|
|||||||
|
__pycache__
|
||||||
|
*.pyc
|
||||||
|
*.pyo
|
||||||
|
*.pyd
|
||||||
|
|
||||||
|
node_modules/
|
||||||
|
.codebuddy/
|
||||||
|
generated-images/
|
||||||
|
artifacts/
|
||||||
|
|
||||||
|
.venv/
|
||||||
|
venv/
|
||||||
|
env/
|
||||||
|
|
||||||
|
.git/
|
||||||
|
.gitignore
|
||||||
|
|
||||||
|
.DS_Store
|
||||||
|
*.log
|
||||||
|
tests/
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
# 基础镜像
|
||||||
|
FROM python:3.12-slim
|
||||||
|
|
||||||
|
# 设置工作目录
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# 先复制 requirements.txt 并安装依赖,利用 Docker 镜像缓存(使用清华镜像源加速)
|
||||||
|
COPY requirements.txt .
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
|
||||||
|
|
||||||
|
# 复制整个项目代码到容器
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# 暴露端口
|
||||||
|
EXPOSE 8005
|
||||||
|
|
||||||
|
# 启动命令:运行 main.py 中的 FastAPI 应用
|
||||||
|
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8005"]
|
||||||
+5
-2
@@ -1,14 +1,17 @@
|
|||||||
# database.py
|
# database.py
|
||||||
# 本文件负责配置数据库连接、创建引擎、会话工厂,并提供依赖注入函数
|
# 本文件负责配置数据库连接、创建引擎、会话工厂,并提供依赖注入函数
|
||||||
|
|
||||||
|
import os
|
||||||
from sqlalchemy import create_engine
|
from sqlalchemy import create_engine
|
||||||
from sqlalchemy.orm import sessionmaker
|
from sqlalchemy.orm import sessionmaker
|
||||||
from sqlalchemy.orm.decl_api import declarative_base
|
from sqlalchemy.orm.decl_api import declarative_base
|
||||||
|
|
||||||
# 1. 配置 MySQL 数据库连接 URL
|
# 1. 配置 MySQL 数据库连接 URL
|
||||||
# 格式:mysql+pymysql://用户名:密码@主机:端口/数据库名?编码
|
# 格式:mysql+pymysql://用户名:密码@主机:端口/数据库名?编码
|
||||||
# 请将下面的 'root', '123456', 'localhost', '3306', 'test_db' 替换为你自己的实际信息
|
# 优先读取环境变量 DATABASE_URL,便于 Docker / 生产环境覆盖;
|
||||||
SQLALCHEMY_DATABASE_URL = "mysql+pymysql://root:123456@localhost:3306/student_management_system"
|
# 本地直接 python main.py 跑时,使用下面的本地默认值。
|
||||||
|
DEFAULT_DATABASE_URL = "mysql+pymysql://root:123456@localhost:3306/student_management_system"
|
||||||
|
SQLALCHEMY_DATABASE_URL = os.getenv("DATABASE_URL", DEFAULT_DATABASE_URL)
|
||||||
|
|
||||||
# 2. 创建数据库引擎
|
# 2. 创建数据库引擎
|
||||||
engine = create_engine(
|
engine = create_engine(
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
# docker-compose.yml
|
||||||
|
# 一条命令启动整个系统:docker compose up -d --build
|
||||||
|
# 停止:docker compose down
|
||||||
|
# 删除数据:docker compose down -v
|
||||||
|
|
||||||
|
services:
|
||||||
|
mysql:
|
||||||
|
image: mysql:8.0
|
||||||
|
container_name: sms-mysql
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: 123456
|
||||||
|
MYSQL_DATABASE: student_management_system
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
command:
|
||||||
|
- --character-set-server=utf8mb4
|
||||||
|
- --collation-server=utf8mb4_unicode_ci
|
||||||
|
- --default-authentication-plugin=mysql_native_password
|
||||||
|
# 注意:不把 3306 映射到宿主机,避免和本机已装的 MySQL 冲突
|
||||||
|
# (应用容器通过 Docker 内部网络 "mysql" 主机名访问,不需要映射)
|
||||||
|
volumes:
|
||||||
|
- mysql_data:/var/lib/mysql
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p123456"]
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 20
|
||||||
|
|
||||||
|
app:
|
||||||
|
build: .
|
||||||
|
container_name: sms-app
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
mysql:
|
||||||
|
condition: service_healthy
|
||||||
|
environment:
|
||||||
|
# 在容器里 mysql 这个 hostname 解析到 mysql 服务
|
||||||
|
DATABASE_URL: mysql+pymysql://root:123456@mysql:3306/student_management_system?charset=utf8mb4
|
||||||
|
ports:
|
||||||
|
- "8005:8005"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
mysql_data:
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
# main0814.py
|
# main0814.py
|
||||||
# 项目入口文件:创建 FastAPI 应用、注册路由、创建数据库表
|
# 项目入口文件:创建 FastAPI 应用、注册路由、创建数据库表
|
||||||
|
from contextlib import asynccontextmanager
|
||||||
from fastapi import FastAPI
|
from fastapi import FastAPI
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from fastapi.responses import FileResponse, JSONResponse
|
from fastapi.responses import FileResponse, JSONResponse
|
||||||
@@ -11,11 +12,20 @@ from starlette.middleware.cors import CORSMiddleware
|
|||||||
from api import student_api, advisor_api, employment_api, score_api, class_api, teacher_api
|
from api import student_api, advisor_api, employment_api, score_api, class_api, teacher_api
|
||||||
from init_db import init_all, drop_tables
|
from init_db import init_all, drop_tables
|
||||||
|
|
||||||
|
|
||||||
|
# 1. 应用生命周期:启动时自动建表(幂等,已有表不会重建)
|
||||||
|
@asynccontextmanager
|
||||||
|
async def lifespan(app: FastAPI):
|
||||||
|
init_all(False, False) # 不重置、不灌种子,仅保证表存在
|
||||||
|
yield
|
||||||
|
|
||||||
|
|
||||||
# 2. 创建 FastAPI 实例
|
# 2. 创建 FastAPI 实例
|
||||||
app = FastAPI(
|
app = FastAPI(
|
||||||
title="FastAPI + SQLAlchemy 分层架构(MySQL)",
|
title="FastAPI + SQLAlchemy 分层架构(MySQL)",
|
||||||
description="用户管理示例,演示分层架构和 MySQL 集成",
|
description="用户管理示例,演示分层架构和 MySQL 集成",
|
||||||
version="1.0.0"
|
version="1.0.0",
|
||||||
|
lifespan=lifespan,
|
||||||
)
|
)
|
||||||
|
|
||||||
# 3. 添加跨域中间件(允许前端跨域请求)
|
# 3. 添加跨域中间件(允许前端跨域请求)
|
||||||
@@ -94,7 +104,7 @@ if __name__ == "__main__":
|
|||||||
import uvicorn
|
import uvicorn
|
||||||
uvicorn.run(
|
uvicorn.run(
|
||||||
"main:app", # 指定应用位置(模块名:应用变量名)
|
"main:app", # 指定应用位置(模块名:应用变量名)
|
||||||
host="0.0.0.0", # 监听所有网络接口
|
host="127.0.0.1", # 只监听本机,终端里的链接可直接点击打开
|
||||||
port=8004, # 端口
|
port=8005, # 端口(与 Dockerfile / docker-compose 一致)
|
||||||
reload=True # 开发模式,代码变动自动重启
|
reload=True # 开发模式,代码变动自动重启
|
||||||
)
|
)
|
||||||
Reference in New Issue
Block a user