python安装操作流程-FastAPI + PostgreSQL简单流程

一、项目环境版本信息(必看,确保兼容性)

以下版本组合经过适配测试,可避免版本冲突,建议严格按照此版本搭建环境:

工具/组件 完整版本详情 核心作用
Conda conda 25.11.0 虚拟环境管理,隔离项目依赖
Python 3.12 项目开发核心编程语言
PostgreSQL PostgreSQL 16.11 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-28), 64-bit 关系型数据库,存储项目业务数据

二、Conda命令无法使用的解决方案(完整步骤)

安装Anaconda后,若终端/命令行提示"conda不是内部或外部命令",可通过以下两种方式彻底解决,任选其一即可:

方式1:手动配置环境变量(永久生效,推荐)

  1. 右键点击「此电脑」→ 选择「属性」→ 点击「高级系统设置」(右上角);

  2. 在弹出的窗口中,切换到「高级」选项卡 → 点击下方「环境变量」按钮;

  3. 在「用户变量」列表中,找到「Path」变量,双击进行编辑;

  4. 点击「新建」,依次添加以下3个路径(替换"你的用户名"为实际Windows用户名 ,例如"张三"则为C:\Users\张三\anaconda3):

    C:\Users\你的用户名\anaconda3

  5. C:\Users\你的用户名\anaconda3\Scripts

  6. C:\Users\你的用户名\anaconda3\Library\bin

  7. 点击「确定」保存所有配置窗口,关闭当前所有终端;

  8. 重新打开终端,输入「conda --version」,若显示conda 25.11.0,则配置生效。

环境变量配置界面参考:

方式2:通过Anaconda Prompt初始化(快速生效)

  1. 打开Windows开始菜单,在搜索框中输入「Anaconda Prompt」,点击运行该程序;

  2. 在Anaconda Prompt窗口中,复制并执行以下命令(替换"你的用户名"为实际用户名 ):
    C:\Users\你的用户名\anaconda3\Scripts\conda.exe init base

  3. 执行完成后,关闭Anaconda Prompt和所有其他终端;

  4. 重新打开任意终端,输入「conda --version」,显示版本号即生效。

三、后端项目目录结构(固定规范,完整无缺失)

项目采用标准FastAPI分层结构,目录清晰,无需修改,直接按此结构创建文件夹和文件即可:

markdown 复制代码
backend/
├── app/                     # 核心业务代码目录(项目核心文件夹,不可删除)
│   ├── main.py              # 项目启动入口(最关键文件,启动服务依赖此文件)
│   ├── database.py          # 数据库连接配置(初始化数据库引擎和会话)
│   ├── models.py            # 数据表结构定义(数据库表与Python类映射)
│   ├── schemas.py           # 接口请求/响应数据格式校验(参数合法性校验)
│   ├── crud.py              # 数据库CRUD操作(增删改查核心逻辑)
│   └── config.py            # 全局配置文件(含数据库连接URL等核心配置)
├── requirements.txt         # 项目依赖包清单(安装依赖时直接使用)
└── README.md                # 项目说明文档(可补充项目介绍、启动说明等)

四、核心文件完整代码(可直接复制运行,无一行遗漏)

以下所有文件代码均完整可运行,复制后按目录结构保存到对应文件夹中,无需修改格式即可使用。

1. requirements.txt(依赖包清单)

创建文件命名为「requirements.txt」,保存到backend目录下,内容如下:

txt 复制代码
fastapi
uvicorn[standard]
sqlalchemy
psycopg2-binary
python-dotenv
pydantic

2. app/config.py(数据库配置文件)

在backend/app目录下创建「config.py」,内容如下(数据库连接URL优先读取环境变量,默认适配本地数据库):

python 复制代码
# app/config.py
import os

# 数据库连接URL配置:优先从环境变量读取,默认使用本地PostgreSQL配置
DATABASE_URL = os.getenv(
    "DATABASE_URL",
    "postgresql://postgres:postgres@localhost:5432/report_platform"
)

3. app/database.py(数据库连接初始化)

在backend/app目录下创建「database.py」,内容如下(初始化数据库引擎、会话工厂和数据表基类):

python 复制代码
# app/database.py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
from app.config import DATABASE_URL

# 创建数据库引擎(核心连接对象,负责与PostgreSQL建立连接)
engine = create_engine(DATABASE_URL)
# 创建数据库会话工厂(每次接口请求会生成独立会话,避免数据冲突)
SessionLocal = sessionmaker(bind=engine)
# 声明数据表基类(所有数据表模型必须继承此类,用于自动创建表)
Base = declarative_base()

4. app/models.py(数据表定义,仅创建1张工作日志表)

在backend/app目录下创建「models.py」,内容如下(仅定义WorkLog工作日志表,字段完整,适配业务需求):

python 复制代码
# app/models.py
from sqlalchemy import Column, String, Date, Text, Numeric
from sqlalchemy.dialects.postgresql import UUID, JSONB
import uuid
from app.database import Base

class WorkLog(Base):
    """工作日志表:存储用户工作记录信息,包含用户名、工作日期、时长、内容等字段"""
    __tablename__ = "work_log"  # 数据库中表的名称,不可重复

    # 主键:UUID格式,自动生成,唯一标识每条工作记录
    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    # 用户名:最长50个字符,存储提交日志的用户名称
    user_name = Column(String(50))
    # 工作日期:日期类型,存储工作的具体日期(格式:YYYY-MM-DD)
    work_date = Column(Date)
    # 工作时长:数值类型,保留2位小数(例如8.5表示8小时30分钟)
    work_hours = Column(Numeric(5, 2))
    # 工作内容:长文本类型,存储详细的工作内容描述
    content = Column(Text)
    # 额外数据:JSONB格式,灵活存储额外信息(如项目ID、任务类型等)
    extra_data = Column(JSONB)

5. app/schemas.py(接口数据格式校验)

在backend/app目录下创建「schemas.py」,内容如下(校验前端请求参数和后端响应格式,避免非法数据):

python 复制代码
# app/schemas.py
from pydantic import BaseModel
from typing import Optional, Dict
from datetime import date

class WorkLogCreate(BaseModel):
    """创建工作日志的请求数据格式:校验前端提交的参数合法性"""
    user_name: str               # 用户名(必填,字符串类型)
    work_date: date              # 工作日期(必填,日期类型,格式YYYY-MM-DD)
    work_hours: float            # 工作时长(必填,浮点型,如8.5)
    content: Optional[str] = None# 工作内容(可选,字符串类型,默认值为None)
    extra_data: Optional[Dict] = None  # 额外数据(可选,JSON格式,默认值为None)

class WorkLogOut(WorkLogCreate):
    """查询工作日志的响应数据格式:返回给前端的数据结构(继承创建格式,新增ID字段)"""
    id: str  # 工作记录ID(返回给前端,用于唯一标识每条记录)

6. app/crud.py(数据库CRUD操作逻辑)

在backend/app目录下创建「crud.py」,内容如下(封装数据库增删改查操作,供接口调用):

python 复制代码
# app/crud.py
from sqlalchemy.orm import Session
from app import models, schemas

def create_worklog(db: Session, data: schemas.WorkLogCreate):
    """创建工作日志:将前端提交的合法数据存入数据库"""
    # 将Pydantic模型数据转换为数据库模型对象(**data.dict()自动解包参数**)
    db_worklog = models.WorkLog(**data.dict())
    # 将对象添加到数据库会话(暂存,未提交到数据库)
    db.add(db_worklog)
    # 提交事务(将数据永久写入数据库)
    db.commit()
    # 刷新对象(获取数据库自动生成的ID等字段,同步到对象中)
    db.refresh(db_worklog)
    # 返回创建后的对象(供接口返回给前端)
    return db_worklog

def list_worklogs(db: Session):
    """查询所有工作日志:从数据库中获取所有工作记录并返回"""
    return db.query(models.WorkLog).all()

7. app/main.py(项目启动入口,最关键文件)

在backend/app目录下创建「main.py」,内容如下(项目启动核心文件,包含接口路由、依赖注入等):

python 复制代码
# app/main.py
from fastapi import FastAPI, Depends
from sqlalchemy.orm import Session
from app.database import SessionLocal, engine
from app import models, schemas, crud

# 初始化数据库:第一次启动服务时,自动创建所有数据表(models中定义的表)
models.Base.metadata.create_all(bind=engine)

# 创建FastAPI应用实例(项目核心对象,配置接口文档标题和描述)
app = FastAPI(title="Report Platform", description="工作日志上报平台后端API服务")

def get_db():
    """依赖注入函数:获取数据库会话,每次请求独立创建和关闭会话"""
    db = SessionLocal()
    try:
        yield db  # 向接口提供数据库会话
    finally:
        db.close()  # 请求结束后,关闭会话,释放资源

@app.get("/")
def root():
    """根接口:测试服务是否正常运行"""
    return {"msg": "backend running"}

@app.post("/worklogs", response_model=schemas.WorkLogOut)
def create_worklog(
    data: schemas.WorkLogCreate, 
    db: Session = Depends(get_db)
):
    """创建工作日志接口(POST请求):接收前端数据,调用CRUD函数存入数据库"""
    return crud.create_worklog(db, data)

@app.get("/worklogs", response_model=list[schemas.WorkLogOut])
def list_worklogs(db: Session = Depends(get_db)):
    """查询所有工作日志接口(GET请求):调用CRUD函数,返回所有工作记录"""
    return crud.list_worklogs(db)

五、数据库配置(仅需执行1句SQL,完整步骤)

项目启动前,必须先在PostgreSQL中创建项目专用数据库,步骤如下:

  1. 打开PostgreSQL客户端(如pgAdmin、psql命令行工具);

  2. 登录PostgreSQL(用户名默认postgres,密码默认postgres,若已修改请使用修改后的密码);

  3. 执行以下SQL语句,创建数据库(数据库名称必须为report_platform,与config.py配置一致):

sql 复制代码
CREATE DATABASE report_platform;

重要提示:数据表无需手动创建!第一次启动FastAPI服务时,会自动根据models.py中的定义创建work_log表。

六、项目启动步骤(严格按顺序执行,一次成功)

以下步骤完整无缺失,严格按照顺序执行,可确保项目正常启动,适配Windows/Linux/Mac所有系统:

步骤1:创建并激活虚拟环境(仅需执行1次)

  1. 打开终端(Windows:CMD/PowerShell/Anaconda Prompt;Linux/Mac:终端);

  2. 进入后端项目根目录(即backend文件夹所在目录,例如:cd D:\projects\backend):
    cd backend

  3. 创建Python虚拟环境(环境名称为venv,默认创建在backend目录下):
    python -m venv venv

  4. 激活虚拟环境(激活成功后,终端前缀会显示「(venv)」):

    Windows系统(CMD/PowerShell):
    venv\Scripts\activate

  5. Linux/Mac系统:
    source venv/bin/activate

步骤2:安装项目依赖(激活虚拟环境后执行)

在激活虚拟环境的终端中,执行以下命令,自动安装requirements.txt中的所有依赖:

bash 复制代码
pip install -r requirements.txt

安装成功提示:所有依赖包显示"Successfully installed",无报错信息。

步骤3:启动项目服务

在激活虚拟环境的终端中,执行以下命令启动FastAPI服务:

bash 复制代码
uvicorn app.main:app --reload

参数说明:

  • app.main:app:指定启动入口(app文件夹→main.py文件→app实例);

  • --reload:热重载模式,修改代码后自动重启服务(开发环境专用,生产环境可删除此参数)。

步骤4:验证服务启动成功

服务启动成功后,终端会输出以下信息(无报错,显示访问地址):

bash 复制代码
Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
Watching for file changes with StatReload

此时,服务已正常启动,本地访问地址:http://127.0.0.1:8000

步骤5:接口测试(两种方式,完整操作)

服务启动后,可通过以下两种方式测试接口,确保接口正常可用:

方式1:使用FastAPI自动生成的接口文档(无需额外工具)

  1. 打开任意浏览器,访问接口文档地址:
    http://127.0.0.1:8000/docs

  2. 在文档页面中,找到「/worklogs」接口(POST方法,创建工作日志);

  3. 点击接口右侧的「Try it out」按钮(展开测试界面);

  4. 在「Request body」中填写JSON格式测试数据(示例如下),可直接复制修改:
    { "user_name": "测试用户", "work_date": "2026-02-04", "work_hours": 8.0, "content": "测试FastAPI接口,创建工作日志", "extra_data": {"project_name": "工作日志平台", "task_id": "TEST-001"} }

  5. 点击「Execute」按钮,发送请求;

  6. 若返回「200 OK」状态码和创建的日志数据,则接口正常;

  7. 测试查询接口:找到「/worklogs」接口(GET方法),点击「Try it out」→「Execute」,可返回所有创建的工作日志。

方式2:使用Apifox测试(推荐,团队协作更高效)

  1. 打开Apifox工具(新建项目或进入现有项目);

  2. 点击左侧「接口管理」→ 顶部「导入」→ 选择「URL导入」;

  3. 在「URL」输入框中,填入FastAPI自动生成的OpenAPI文档地址:
    http://127.0.0.1:8000/openapi.json

  4. 点击「确定」,Apifox会自动导入所有接口(含请求参数、响应格式、数据校验规则);

  5. 导入完成后,选择任意接口(如POST /worklogs),填写测试数据,点击「发送」即可测试;

  6. Apifox界面参考:

七、Git配置文件(完整无缺失,直接使用)

以下两个Git配置文件放在项目根目录(与backend文件夹同级),用于规范Git提交格式、忽略无用文件,避免团队协作冲突,完整保留所有配置项。

1. .gitattributes(规范文件格式,统一跨平台行为)

gitattributes 复制代码
##############################################################################
# 1. 全局通用配置:统一换行符规范,适配所有平台 Windows/macOS/Linux
##############################################################################
# 自动识别文本文件和二进制文件,提交时统一转为LF,检出时适配系统
*               text=auto

# 强制指定以下文本文件使用LF换行(标准化配置,避免跨平台格式冲突)
*.text          eol=lf
*.md            eol=lf
*.json          eol=lf
*.yaml          eol=lf
*.yml           eol=lf
*.toml          eol=lf
*.conf          eol=lf
*.env.example   eol=lf
*.gitignore     eol=lf
*.gitattributes  eol=lf

##############################################################################
# 2. 前端 Vue3 专项配置(frontend/ 目录下所有前端相关文件,预留前端集成)
##############################################################################
# 核心代码文件(文本格式,LF换行)
frontend/**/*.vue       text eol=lf
frontend/**/*.js         text eol=lf
frontend/**/*.ts         text eol=lf
frontend/**/*.jsx        text eol=lf
frontend/**/*.tsx        text eol=lf
frontend/**/*.html       text eol=lf
# 样式文件(文本格式,LF换行)
frontend/**/*.css        text eol=lf
frontend/**/*.scss       text eol=lf
frontend/**/*.less       text eol=lf
# 配置文件(文本格式,LF换行,依赖锁文件合并冲突时保留本地版本)
frontend/**/.eslintrc.*  text eol=lf
frontend/**/prettierrc.* text eol=lf
frontend/**/vite.config.* text eol=lf
frontend/**/package.json text eol=lf
frontend/**/pnpm-lock.yaml text eol=lf merge=ours
frontend/**/yarn.lock    text eol=lf merge=ours
frontend/**/package-lock.json text eol=lf merge=ours

# 前端二进制资源(禁止换行转换,不做文本diff对比,避免文件损坏)
frontend/**/*.png        -text diff=binary
frontend/**/*.jpg        -text diff=binary
frontend/**/*.jpeg       -text diff=binary
frontend/**/*.gif        -text diff=binary
frontend/**/*.svg        text eol=lf  # SVG为文本格式,可正常diff对比
frontend/**/*.ico        -text diff=binary
frontend/**/*.woff       -text diff=binary
frontend/**/*.woff2      -text diff=binary
frontend/**/*.ttf        -text diff=binary
frontend/**/*.eot        -text diff=binary

# 前端构建产物/第三方依赖(标记为生成文件,GitHub不统计代码量)
frontend/dist/**         linguist-generated=true
frontend/node_modules/** linguist-vendored=true

##############################################################################
# 3. 后端 Python (FastAPI) 专项配置(backend/ 目录下所有后端文件)
##############################################################################
# Python 核心代码(文本格式,LF换行,支持Python语法diff对比)
backend/**/*.py          text eol=lf diff=python
backend/**/*.pyi         text eol=lf
# Python 依赖/环境配置(文本格式,LF换行,依赖锁文件合并冲突时保留本地版本)
backend/**/requirements.txt    text eol=lf
backend/**/pyproject.toml      text eol=lf
backend/**/poetry.lock         text eol=lf merge=ours
backend/**/Pipfile             text eol=lf
backend/**/Pipfile.lock        text eol=lf merge=ours

# Python 缓存/虚拟环境(标记为第三方/生成文件,忽略代码统计)
backend/**/__pycache__/**      linguist-generated=true
backend/**/.venv/**            linguist-vendored=true
backend/**/venv/**             linguist-vendored=true
backend/**/env/**              linguist-vendored=true

# 日志/临时数据文件(日志为文本格式,数据库文件为二进制,禁止diff对比)
backend/**/*.log         text eol=lf linguist-generated=true
backend/**/*.sqlite       -text diff=binary
backend/**/*.db           -text diff=binary

##############################################################################
# 4. 大文件管理 Git LFS 配置(可选,用于大于100MB的资源文件)
##############################################################################
# 若项目包含视频、模型文件、大型压缩包等,需先安装Git LFS,再启用以下规则
#*.zip           filter=lfs diff=lfs merge=lfs -text
#*.rar           filter=lfs diff=lfs merge=lfs -text
#*.mp4           filter=lfs diff=lfs merge=lfs -text
#*.h5            filter=lfs diff=lfs merge=lfs -text
#*.ckpt          filter=lfs diff=lfs merge=lfs -text

##############################################################################
# 5. 合并冲突优化:锁文件强制保留本地版本,避免依赖冲突
##############################################################################
# merge=ours 表示合并冲突时,自动保留当前分支的文件,适用于依赖锁文件
[merge "ours"]
    driver = true

2. .gitignore(忽略无用文件,减小仓库体积)

gitignore 复制代码
# ==============================================
# 全局通用忽略规则(系统/编辑器缓存,全项目生效)
# ==============================================
# 系统缓存文件(Windows/macOS系统自动生成,无需提交)
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

# 编辑器/IDE 配置文件(适配VS Code、IDEA、Sublime等,无需提交)
.idea/
.vscode/
*.swp
*.swo
*~
.project
.c9/
*.launch

# 环境变量敏感文件(核心:禁止提交真实密钥、数据库密码等敏感信息)
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
.env.*.local

# 日志/临时文件(自动生成,无需提交)
*.log
logs/
tmp/
temp/
*.tmp

# ==============================================
# 前端 Vue3 (Vite) 专用忽略规则(适配frontend/目录,预留前端集成)
# ==============================================
# 依赖包(体积大,可通过package.json重新安装,无需提交)
frontend/node_modules/

# 构建打包产物(自动生成,无需提交,部署时重新构建)
frontend/dist/
frontend/build/

# 前端缓存文件(自动生成,无需提交)
frontend/.cache/
frontend/.vite/
frontend/.eslintcache
frontend/.stylelintcache

# 测试覆盖率文件(自动生成,无需提交)
frontend/coverage/

# ==============================================
# 后端 Python (FastAPI) 专用忽略规则(适配backend/目录)
# ==============================================
# Python 字节码缓存(自动生成,无需提交)
backend/**/__pycache__/
backend/**/*.py[cod]
backend/**/*$py.class
backend/**/.Python

# 虚拟环境(自动生成,可重新创建,无需提交)
backend/.venv/
backend/venv/
backend/env/
backend/ENV/
backend/.env/

# 依赖安装缓存(自动生成,无需提交)
backend/*.egg-info/
backend/.eggs/
backend/dist/
backend/build/
backend/*.egg

# 数据库文件(本地测试库,禁止提交,避免数据冲突)
backend/*.db
backend/*.sqlite3
backend/*.sql

# 测试/覆盖率文件(自动生成,无需提交)
backend/htmlcov/
backend/.coverage
backend/.pytest_cache/

# Mypy 类型检查缓存(自动生成,无需提交)
backend/.mypy_cache/
相关推荐
_深海凉_6 分钟前
LeetCode热题100-颜色分类
python·算法·leetcode
AC赳赳老秦29 分钟前
OpenClaw email技能:批量发送邮件、自动回复,高效处理工作邮件
运维·人工智能·python·django·自动化·deepseek·openclaw
zhaoshuzhaoshu37 分钟前
Python 语法之数据结构详细解析
python
AI问答工程师1 小时前
Meta Muse Spark 的"思维压缩"到底是什么?我用 Python 复现了核心思路(附代码)
人工智能·python
zfan5202 小时前
python对Excel数据处理(1)
python·excel·pandas
小饕2 小时前
我从零搭建 RAG 学到的 10 件事
python
老歌老听老掉牙2 小时前
PyQt5+Qt Designer实战:可视化设计智能参数配置界面,告别手动布局时代!
python·qt
格鸰爱童话3 小时前
向AI学习项目技能(六)
java·人工智能·spring boot·python·学习
悟空爬虫-彪哥3 小时前
VRChat开发环境配置,零基础教程
python
数据知道3 小时前
《 Claude Code源码分析与实践》专栏目录
python·ai·github·claude code·claw code