摘要:本文是一份全面的Python全栈开发学习笔记,系统性地梳理了从Python基础语法到高级编程、再到现代开发环境的完整知识体系。内容涵盖Python语言核心(数据类型、流程控制、函数、面向对象、高级特性如生成器与装饰器)、Linux常用命令、Docker容器化部署、FastAPI Web框架以及SQLAlchemy ORM等关键技术。笔记以要点和代码示例为主,适合开发者快速回顾核心概念与实践要点。

一. python

1.python概述

1.1 计算机的组成

计算机由运算器、控制器、存储器、输入设备和输出设备等五个逻辑部件组成

1.2 计算机语言的发展简史

机器语言(二进制代码)-->汇编语言(符号语言)-->高级语言(C、C++、Java、PHP、JavaScript、Python等)

1.3 python的特点

1.3.1 python优点
  • 简单易学

  • 广泛的标准库和大量的第三方模块

  • 可移植可扩展

  • 免费开源

1.3.2 python缺点
  • 解释语言,运行速度慢

  • 代码不能加密

1.4 python应用

  • Web应用开发(FastAPI、Django、Flask)

  • 网络爬虫

  • 系统网络运维

  • 数据分析与科学计算(Numpy、Scipy)

  • 人工智能与机器学习(TensorFlow、Keras)

1.5 Python解释器

  • CPython(Python 3.x后)

  • IPython

  • PyPy

  • Jython

  • IronPython

2. 基础知识

2.1 注释

  • 对代码解释说明

  • 提高代码可读性

  • 屏蔽掉暂时不需要的代码

  • 定位程序出错的位置

2.1.1 注释分类
  • 单行注释(行注释)

  • 多行注释(块注释)

2.2 变量

2.2.1 标识符命名规则
  • 只能包含字母、数字和下划线,且不能以数字开头

  • 区分大小写

  • 不要和关键字重复

2.3 进制及转换

  1. 二进制:以0b或0B开头表示 bin(dec)

  2. 八进制:以0o开头表示 oct(dec)

  3. 十六进制:以0x或0X开头表示,此处的A-F不区分大小写 hex(dec)

2.4 数据类型

  • 基本数据类型

  1. 数值(整数(int)、浮点数(float)、复数(complex)、布尔(bool))

  • 字符串(str)

  • 容器数据类型

  1. 列表(list)

  2. 元组(tuple)

  3. 集合(set)

  4. 字典(dict)

  • 特殊数据类型

  1. None

表示空值或缺失值,只有一个值 None。常用于函数没有返回值时,或者表示变量没有被赋值。

  • 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组)

  • 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)

2.4.1 int整型
num1 = True
num2 = 10
print(type(num1))  # <class 'bool'>
print(type(num2))  # <class 'int'>
print(type(num1) == type(num2))  # False
print(isinstance(num1, bool))  # True
print(isinstance(num1, int))  # True,Python3中,bool是int的子类
print(isinstance(num2, int))  # True
​

2.4.2 float浮点型
2.4.3 bool布尔型
  • False

  • None

  • 0

  • 0.0

  • 所有的空容器(空列表、空元组、空字典、空集合、空字符串)

2.4.4 str 字符串

3. 流程控制语句

  • 顺序

  • 分支

  1. 单分支

  2. 多分支

  3. 嵌套分支

  4. match case语句

  5. 三目运算符(表达式1 if 判断条件 else 表达式2)

  • while 循环

  • for 循环(遍历可迭代对象,如列表或字符串)

  • continue(跳过当前循环块中的剩余语句,继续进行下一轮循环)

  • break(for 或while循环终止)

4.容器数据类型

4.1 序列(Sequence)

  • 一种基本且核心的数据结构,它允许我们以有序的方式存储和操作数据。序列可以包含不同类型的元素,并且支持通过索引来访问和修改这些元素。

  • 常见的序列类型包括:列表(List)、元组(Tuple)、字符串(String)

4.2 列表List

  1. 一个可变的、有序的元素集合

  2. 用 [] 定义,数据之间使用 , 分隔

  3. 索引或下标访问

  4. 元素可以是不同的类型

  • 访问列表

  1. 通过索引获取列表中元素

  2. 列表切片

  • 向列表中添加元素(append/insert/extend)

  • 修改列表中元素(下标/切片)

  • 列表推导式

squares = [x**2 for x in range(10) if x % 2 == 0]
  • zip() 函数可将多个可迭代对象中对应元素打包为一个个元组

4.3 字符串 str

  • 替换 str.replace(old,new[,max])

  • 分割str.split(x)

  • 合并(x作为分隔符)x.join(seq)

4.4 元组 Tuple

  1. 不可变的、有序的元素集合,不能对元组中的元素进行修改操作

  2. 使用 () 定义,数据之间使用,分隔

  3. 索引或下标访问

  4. 元素可以是不同的类型

4.5 集合Set

  1. 无序的,且不包含重复元素

  2. 用 {} 定义,数据之间使用 , 分隔,也可以使用set()定义

  3. 没有索引,所以不能通过切片方式访问集合元素

  4. 元素可以是不同的类型

  5. 可以进行数学上的集合操作,如并集、交集和差集

  6. 适用于需要快速成员检查、消除重复项和集合运算的场景

  • 添加元素.add()

  • 删除元素.remove()

  • 遍历集合 in

4.6 字典Dictionary

  1. 无序的键值对集合,键是唯一的,而值可以重复,没有索引

  2. 用 {}或dict() 定义,键(key)和值(value)使用 : 连接,每个键值对之间使用 , 分隔

  3. 通过键来获取对应的值

  4. 值可以取任何数据类型,但键必须是不可变的,如字符串、数字、元组

5. 函数

  • 定义函数使用 def 关键字

  • 先定义再调用

  • 若函数的形参是定长参数,可以通过 * 和 ** 对列表、元组、字典等解包传参

  • / 前的参数必须使用位置传参,* 后的参数必须用关键字传参

  • global : 修改全局变量

  • nonlocal : 内部作用域修改外部作用域(函数中)的变量

  • 用 lambda 来定义匿名函数 (lambda 参数列表: 表达式)

    def operator(a, b):
        return a + b
    ​
    def function(a, b, operator):
        return operator(a, b)
    ​
    print(function(1, 2, lambda x, y: x + y))

6. 文件操作

  1. 纯文本文件

  2. 二进制文件(如图片文件(jpg、png),视频文件(avi)等)

r : 读 ; w : 写 ; a : 追加写 ; x : 创建文件写 ; b : 二进制 ; t : 文本模式 ; + : 读写

  • read([size]) 可以从文件中读取数据,size 表示要从文件中读取的数据的长度(编码模式b:单位是字节,编码模式t:单位是字符),如果没有传入 size 则读取文件中所有的数据

  • readline([size]) 可以从文件中读取整行数据,也可以通过 size 设置读取数据的长度

  • readlines([size]) 读取所有行并返回列表,若给定 size>0,返回总和大约为 size 字节的行, 实际读取值可能比 size 大

6.1 with上下文管理器

try:
    with open("test.txt", "w") as f:
        f.write(a)
finally:
    print("文件是否关闭:", f.closed)  # 文件是否关闭: True

7. 面向对象之类和对象

  • 类是创建对象的模板

  • 对象是类的实例(Instance)

  • 类名一般使用大驼峰命名法

  • 类方法在类中通过 @classmethod 定义,第一个参数为cls,代表类本身

  • 静态方法在类中通过 @staticmethod 定义 , 不访问实例属性或类属性,只依赖于传入的参数

  • 魔法方法 : 方法名中有两个前缀下划线和两个后缀下划线的方法

8. 面向对象之三大特性

8.1 封装

  • 将变量和函数写入类中的操作即为封装,即类中封装了属性和方法

  • 通过双下划线定义私有属性或私有方法

8.1.1 property
  • 方法转换为属性 : 可通过@property装饰器将一个方法转换为属性来调用。转换后可直接使用 .方法名 来使用,而无需使用 .方法名()

class Person:
​
    def __init__(self, name):
        self.name = name
​
    @property
    def eat(self):
        print(f"{self.name} is eating...")
​
p = Person("张三")
p.eat   # 张三 is eating...
  • 只读属性 : 将方法名设置为去掉双下划线的私有属性名,方法中返回私有属性

class Person:
​
    def __init__(self, name):
        self.__name = name
​
    @property
    def name(self):
        return self.__name
​
p = Person("张三")
print(p.name)  # 张三
p.name = "李四"  # 报错
  • 读写属性:将方法名设置为去掉双下划线的私有属性名,方法中返回私有属性

class Person:
​
    def __init__(self, name):
        self.__name = name
​
    @property
    def name(self):
        return self.__name
​
    @name.setter
    def name(self, name):
        self.__name = name
​
p = Person("张三")
print(p.name)  # 张三
​
p.name = "李四"
print(p.name)  # 李四

8.2 继承

  • 子类继承父类中的属性和方法,实现代码重用。子类可以新增自己特有的方法,也可以重写父类的方法

  • 子类不能继承父类的私有属性和私有方法

  • 支持多继承

  • 子类可以在类中使用 super().方法名() 或 父类名.方法名() 来调用父类的方法

8.2.1 方法解析顺序(mro)
  • 类名.mro 访问类的继承链来查看方法解析顺序

8.2.2 方法重写
  • 在子类中定义与父类方法重名的方法,调用时会调用子类中重写的方法

8.3 多态

9. 错误和异常

  1. 语法错误 : 程序解析时遇到的错误

  2. 异常 : 运行期检测到的错误

  • 用 try except 语句来捕获异常并处理

  • 用 raise 来抛出异常

  • assert用于判断一个表达式,在表达式条件为False的时候触发异常,常用于调试程序

def int_add(x, y):
    assert isinstance(x, int) and isinstance(y, int), "参数类型错误"
    return x + y
​
print(int_add(1, 2))  # 3
print(int_add("1", "2"))  # AssertionError: 参数类型错误

10. 模块和包

  • 使用from import *导入模块时,在被导入的模块中使用 all设置哪些内容可以被导入。all 的设置只针对使用 from import * 导入模块时有效

__all__ = ["num","add"] #  内容必须要用引号引起来
num = 100
num1 = 200
_str1="abc"
def add(a, b):
"""求两个数的和"""
return a + b

10.1 常见的标注库(包)

  • os : 多种操作系统接口

  • sys : 系统相关的形参和函数

  • time : 时间的访问和转换\

  • datetime : 操作日期和时间的类

  • math : 数学函数

  • random : 生成伪随机数

  • re : 正则表达式匹配操作

  • json

  • collections :

10.2 引入第三方库

  1. 阿里云:Simple Index

  2. 豆瓣:http://pypi.douban.com/simple/

  3. 清华大学:Simple Index

  • pip install 包名

  • 临时使用其他源 : pip install -i Simple Index 包名

  • 永久修改源 : pip config set global.index-url Simple Index

    打包自己的库并安装

    1. pip install setuptools

    2. 在包外创建一个 setup.py文件

    3. from distutils.core import setup
      setup(
      name="graphic",  # 需要打包的名字
      version="1.0",  # 版本
      py_modules=["graphic.circle", "graphic.rectangle"],  # 需要打包的模块
      )
    4. pip install setuptools

11.Python高级语法

11.1 浅拷贝与深拷贝

  1. 直接赋值:对象的引用(别名),不产生拷贝

  2. 浅拷贝:拷贝父对象,不会拷贝对象的内部的子对象。拷贝后只有第一层是独立的

  3. 深拷贝:完全拷贝了父对象及其子对象。拷贝后所有层都是独立的

  • 使用 copy() 对其浅拷贝。使用 id() 查看列表地址和列表中各个元素的地址

  • 使用 copy 模块的 deepcopy() 函数

11.2 迭代器

  • 可迭代对象

可以直接作用于 for 循环的数据类型有以下几种:

  1. 容器,如 list 、 tuple 、 dict 、 set 、 str 等。

  2. generator ,包括生成器和带 yield 的generator function

  • 判断是否是可迭代对象(Iterable)

from collections.abc import Iterable
print(isinstance([], Iterable))  # True
print(isinstance((), Iterable))  # True
print(isinstance(set(), Iterable))  # True
print(isinstance({}, Iterable))  # True
print(isinstance("100", Iterable))  # True
print(isinstance(100, Iterable))  # False
  • 判断是否是迭代器(Iterator)

from collections.abc import Iterator
print(isinstance([], Iterator))  # False
print(isinstance((), Iterator))  # False
print(isinstance(set(), Iterator))  # False
print(isinstance({}, Iterator))  # False
print(isinstance("100", Iterator))  # False
print(isinstance((x for x in range(10)), Iterator))  # True
list = [1, 2, 3]
it = iter(list)  # 创建迭代器对象
print(next(it))  # 输出迭代器的下一个元素,1
print(next(it))  # 2
print(next(it))  # 3
print(next(it))  # StopIteration
list = [1, 2, 3]
it = iter(list)  # 创建迭代器对象
for i in it:
print(i)

11.3 生成器

  • 一个用于创建迭代器的简单而强大的工具。它的写法类似于标准的函数,但当它要返回数据时会使用 yield 语句。当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后的表达式作为当前迭代的值返回

  • 每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行(它会记住上次执行语句时的所有数据值),直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果

11.3.1 创建生成器
  1. 使用推导式创建生成器

generator = (x for x in range(5))  # 创建生成器
print(generator)  # <generator object <genexpr> at 0x0000026C2066CB80>
for x in generator:
    print(x)
  1. 使用函数创建生成器

def fibo():  # 斐波那契数列
    a, b = 0, 1
    while True:
        yield b
        a, b = b, a + b
f = fibo()
print(next(f))  # 1
print(next(f))  # 1
print(next(f))  # 2
print(next(f))  # 3
print(next(f))  # 5

11.4 闭包

  • 构建闭包的条件 :

  1. 外部函数内定义一个内部函数

  2. 内部函数用到外部函数中的变量

  3. 外部函数将内部函数作为返回值

11.5 装饰器

  • 不修改原有函数代码的基础上,动态地增加或修改函数的功能

from math import sqrt

def func(x): """开根号""" return sqrt(x)

def decorator(f): def inner(x): x = abs(x) # 求x的绝对值 return f(x)

return inner

func = decorator(func) print(func(-4)) # 2.0

from math import sqrt

def decorator(f): def inner(x): x = abs(x) # 求x的绝对值 return f(x)

return inner

@decorator def func(x): """开根号""" return sqrt(x)

print(func(-4)) # 2.0

12. 进程与线程

  • 并发 : 单个 CPU 处理多个任务。各个任务交替执行一段时间

  • 并行 : 多个 CPU 同时执行多个任务

12.1 多进程

  • 进程是操作系统进行资源分配的基本单位

  • 操作系统中一个正在运行的程序或软件就是一个进程

  • 每个进程都有自己独立的一块内存空间

12.1.1 创建进程
  1. 使用Process()创建进程

  2. 自定义Process子类创建进程,继承Process

  3. 当需要启动大量子进程时,可以使用进程池Pool()

12.2 多线程

  • 线程是处理器任务调度和执行的基本单位

  • 一个进程至少有一个线程,也可以运行多个线程

  • 多个线程之间可共享数据

  • 线程运行出错异常后,如果没有捕获,可能会导致整个进程崩溃

  • 多线程是指在同一进程中同时执行多个任务

12.2.1 创建进程
  1. 使用Thread创建线程

  2. 自定义Thread子类创建线程,继承Thread

  3. 线程池创建ThreadPoolExecutor()

13. 协程(Coroutine)

  • 协程(Coroutine)是Python中处理高并发场景的强大工具,尤其在 I/O 密集型任务中表现出色。协程是一种用户态的轻量级线程,它不像线程那样由操作系统调度,而是由程序自身控制,所以也叫微线程

13.1 协程的优势

  1. 调度者:协程由程序自身进行调用,主动让出CPU给其他协程(通过 await 关键字)

  2. 轻量级:创建成本极低,一个线程程可以轻松创建数万个协程

  3. 无锁机制:同一时间只有一个协程运行,无需锁保护共享资源

  4. 与线程相比,协程避免了操作系统级别的上下文切换开销,只有极小的函数调用开销,在处理大量 I/O 操作时效率更高

13.2 async和await

13.2.1 定义协程函数:async def
  • 使用async def关键字定义的函数就是协程函数,它返回一个协程对象

import asyncio
这是一个协程函数
async def hello():
print("Hello")
# await 关键字只能在协程函数内部使用
await asyncio.sleep(1) # 模拟I/O操作
print("World")
调用 hello() 不会立即执行,只会返回一个协程对象
coro_obj = hello()
print(type(coro_obj)) # 输出: <class 'coroutine'>

13.3 运行协程:事件循环

import asyncio
import time
async def my_func(name, delay):
print(f"任务 {name} 开始")
# 遇到 await,协程让出控制权
await asyncio.sleep(delay)
print(f"任务 {name} 完成")
return f"任务 {name} 结果"
async def main_sync():
print("--- 串行执行(总耗时 1s + 2s = 3s)---")
# await 串行执行:必须等待前一个 task 完成,才会开始下一个
await my_func("A", 1)
await my_func("B", 2)
if name == "main":
start_time = time.time()
asyncio.run(main_sync())
print(f"串行耗时: {time.time() - start_time:.2f}秒")
输出:
--- 串行执行(总耗时 1s + 2s = 3s)---
任务 A 开始
任务 A 完成
任务 B 开始
任务 B 完成
串行耗时: 3.02秒

13.4 事件循环(Event Loop) 详述

  • 事件循环是协程并发模型的核心,它是负责调度、管理和执行所有协程的“心脏”

13.4.1 注册任务
  1. asyncio.run(main_coro)(顶级注册,启动程序)

  2. asyncio.create_task(coro)(最常用,实现并发)

  3. await coro(隐式注册,实现串行)

13.5 实现并发:Task与asyncio.gather()

import asyncio
import time

async def my_func(name, delay): print(f"任务 {name} 开始...") await asyncio.sleep(delay) print(f"任务 {name} 完成.") return f"结果 of {name}"

async def main_concurrent(): print("--- 并发执行(总耗时 max(1s, 2s) = 2s)---")

# 1. 创建 Task:协程被包装成任务,立即启动在后台运行
task1 = asyncio.create_task(my_func("C", 1))
task2 = asyncio.create_task(my_func("D", 2))

# 2. 等待 Task 完成:await asyncio.gather() 等待所有任务结束
#   注意:这里的 await 只是等待结果,任务本身早已开始并发运行。
results = await asyncio.gather(task1, task2)

print(f"所有结果: {results}")

if name == "main": start_time = time.time() asyncio.run(main_concurrent()) print(f"并发总耗时: {time.time() - start_time:.2f}秒") 输出: --- 并发执行(总耗时 max(1s, 2s) = 2s)--- 任务 C 开始... 任务 D 开始...

二、Linux

  • Linux系统中一切皆文件

  • APT常用命令:

list - 根据名称列出软件包

search - 搜索软件包描述

show - 显示软件包细节

install - 安装软件包

reinstall - 重新安装软件包

remove - 移除软件包

update - 更新可用软件包列表

1.常用基本命令

    帮助命令:
        man ls - 查看ls命令的帮助信息
        help cd - 查看cd命令的帮助信息
    常用快捷键:
        Ctrl + L - 清屏;彻底清屏是:clear
        Ctrl + U - 清除当前敲的命令
    文件命令:
        pwd - 显示当前工作目录的绝对路径
        touch test/a/note.txt - 创建空文件
        cp -r test/b/ ./ - 递归复制
        rm -r b/ - 递归删除
        mv a.txt b.txt - 重命名
        mv test/a.txt ./ - 移动文件
        cat -n a.txt - 查看文件显示行号
        tail - 输出文件尾部内容(默认10行; -n 5:尾部5行;-F:实时输出)
        echo - 输出内容到控制台
    vim命令:
        yy - 复制光标当前一行
        p - 箭头移动到目的行粘贴
        u - 撤销上一步
        dd - 删除光标当前行
        :wq!  - 强制保存退出
    用户管理命令:
           su 用户名称  -  切换用户,只能获得用户的执行权限,不能获得环境变量
    用户管理命令:
               su 用户名称  -  切换用户,只能获得用户的执行权限,不能获得环境变量
               su - 用户名称       -  切换到用户并获得该用户的环境变量及执行权限
               useradd [-g 组名] 用户名     - 添加新用户到某个组
                passwd 用户名  -  设置用户密码
                id 用户名    -  查看用户是否存在
                cat  /etc/passwd  - 查看创建了哪些用户
                userdel  用户名    -   删除用户但保存用户主目录
               userdel -r 用户名  -   删除用户的同时,删除与用户相关的所有文件
        文件权限:
            0                     123               456  789
            类型(d:目录/l:链接文档)  属主(rwx:读写执行)   属组   其他用户权限
            chmod 改变权限:
                u:所有者 g:所有组 o:其他人 a:所有人(u、g、o的总和)rwx=4+2+1=7
                chmod u-x,o+x passwd  -  修改文件属主用户执行权限,并使其他用户具有执行权限
                chmod -R 777 test   -   
        压缩c:tar -zcvf xxx.tar.gz
        解压x:tar -zxvf xxx.tar.gz
        查看磁盘空间:df -h    

三.Docker

官网地址:Docker: Accelerated Container Application Development

  • 提供了一套标准化的环境打包与运行方案:把代码、依赖、配置、系统环境全部打包在一起,形成一个可移植的容器

添加国内镜像源
  "registry-mirrors": [
   "https://docker.xuanyuan.me",
    "https://docker.1ms.run",
    "https://docker.m.daocloud.io",
    "http://hub-mirror.c.163.com",
    "https://docker.unsee.tech",
    "https://dockerpull.org",
    "https://docker.1panel.live",
    "https://dockerhub.icu",
    "https://docker.nju.edu.cn",
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.baidubce.com",
    "https://5tqw56kt.mirror.aliyuncs.com",
    "https://docker.hpcloud.cloud",
    "http://mirrors.ustc.edu.cn",
    "https://docker.chenby.cn",
    "https://docker.ckyl.me",
    "http://mirror.azure.cn",
    "https://hub.rat.dev",
    "https://mbirror.ccs.tencentyun.com"
  ]
Docker部署:
#更新软件包
sudo apt update
​
sudo apt upgrade
​
#安装docker依赖
sudo apt install software-properties-common
​
sudo apt-get install ca-certificates curl gnupg lsb-release
​
#添加Docker官方GPG密钥
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
​
#添加Docker软件源(输入后根据提示按Enter)
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
​
#安装docker(输入后根据提示输入 y )
sudo apt-get install docker-ce docker-ce-cli containerd.io --fix-missing
​
#安装完毕,启动docker,并查看状态
sudo systemctl start docker
​
sudo systemctl status docker
​

1.Docker优势

  1. 可移植性

  2. 可伸缩性

  3. 隔离性

2.Docker核心概念

2.1 镜像(Image)—类比「软件安装包」

  • 只读(不能直接修改),可作为模板,创建多个容器

  • 包含了运行某个应用程序所需的全部环境(比如操作系统、软件依赖、配置文件等)

2.2 容器(Container)—类比「已安装好的软件」

  • 镜像的运行实例,是一个可读写的独立环境,相当于“把安装包安装好后,能直接使用的软件”

  • 可启动、停止、删除,多个容器相互独立;容器删除后,里面的数据默认会丢失(可通过“数据卷”保留,后续会讲)

2.3 仓库(Repository)—类比「手机应用商店」

官方仓库地址:https://hub.docker.com/

  • 用于存放和下载镜像的平台

2.4 数据卷(Volume)—— 类比「电脑的D盘(专门存数据)」

  • 数据卷是Docker中用于持久化数据的工具,相当于“给容器挂一个独立的存储盘”,容器删除后,数据卷中的数据不会丢失

2.5 核心工具Dockerfile和Docker Compose

2.5.1 Dockerfile —自定义镜像的“构建脚本”
  • 一个纯文本文件(无后缀名),包含一系列简单的指令,用于告诉Docker“如何构建自定义镜像”

2.5.2 Docker Compose —多容器的“一键管理工具”
  • 一个用于管理多容器的工具,通过一个yaml格式的配置文件(固定命名为docker-compose.yml),定义多个关联容器的配置(比如镜像、端口、依赖关系),执行一条命令就能一键启动、停止所有容器

# 核心功能:一键启动MySQL容器+Python应用容器,实现容器间通信、数据持久化
​
services:
  # 容器1:MySQL服务容器(命名为mysql-db,容器间可通过该名称访问)
  mysql-db:
    # 基础镜像:指定MySQL 8.0.45版本(稳定性高,适配Python连接)
    image: mysql:8.0.45
    # 重启策略:容器意外关闭/服务器重启时,自动重启(保证服务可用性)
    restart: always
    # 环境变量:配置MySQL核心参数(无需手动进入容器修改)
    environment:
      MYSQL_ROOT_PASSWORD: "123456"  # root用户密码(自定义,Python连接需一致)
      MYSQL_DATABASE: "test_db"      # 自动创建初始数据库(无需手动建库)
      # 字符编码配置:适配MySQL 8.0+,避免中文乱码/连接报错
      MYSQL_INITDB_ARGS: "--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci"
    # 端口映射:本地9999端口 → 容器内3306端口(避免与本地MySQL端口冲突)
    ports:
      - "9999:3306"
    # 数据卷挂载:Windows本地D盘mysql-data目录 → 容器内MySQL数据目录(持久化数据)
    volumes:
      - D:/mysql-data:/var/lib/mysql
    # 加入自定义网络:与Python容器互通(容器间通信的基础)
    networks:
      - app-network
    # 健康检查:判断MySQL服务是否真正就绪(而非仅容器启动),解决连接拒绝问题
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p123456"]  # 检测MySQL是否可ping通
      interval: 3s          # 每3秒检查一次
      timeout: 3s           # 单次检查超时时间3秒
      retries: 10           # 最多重试10次(覆盖MySQL启动初始化时间)
      start_period: 5s      # 容器启动后,延迟5秒再开始检查(避免过早检测)
​
  # 容器2:Python应用容器(命名为python-app,业务代码运行载体)
  python-app:
    # 构建规则:基于当前目录下的Dockerfile,构建自定义Python镜像
    build: .
    # 依赖条件:等待mysql-db容器的健康检查通过后,再启动本容器(核心修复:解决MySQL未就绪问题)
    depends_on:
      mysql-db:
        condition: service_healthy  # 仅当MySQL服务就绪时,才启动Python容器
    # 环境变量:传递MySQL连接信息(Python代码可通过os.getenv获取,无需硬编码)
    environment:
      MYSQL_HOST: "mysql-db"    # 容器间通信地址:直接填MySQL容器名(无需IP)
      MYSQL_PORT: "3306"        # MySQL容器内端口(非本地9999)
      MYSQL_USER: "root"        # 与MySQL容器的用户名一致
      MYSQL_PASSWORD: "123456"  # 与MySQL容器的密码一致(修改需同步)
      MYSQL_DB: "test_db"       # 与MySQL容器自动创建的数据库名一致
    # 加入自定义网络:与MySQL容器在同一网络,才能通信
    networks:
      - app-network
​
# 自定义网络:桥接模式(Docker默认),保证两个容器相互可见、可访问
networks:
  app-network:
    driver: bridge
​

3.基础命令

docker --version
docker compose version
​
docker pull mysql:8.0.45
​
查看镜像
docker images
​
ocker run -d --name mysql-db -p 9999:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.45
​
查看容器
docker ps
​

四.FastAPI

  • 一个现代、快速(高性能)的Web框架,用于构建API

  • 类型提示(type hints)和异步编程(asyncio)能力,使得代码易于编写、阅读和维护

  • 有自动交互式文档(基于 OpenAPI 规范和 JSON Schema)、数据验证、依赖注入(Dependency Injection)等功能

from fastapi import APIRouter
​
# 实例化一个 APIRouter,可指定前缀(所有路由自动加上 /users)
router = APIRouter(
    prefix="/users",
    tags=["用户管理"]  # 文档中归类为「用户管理」
)
​
# 定义用户相关路由
@router.get("/")
def get_all_users():
    return {"message": "获取所有用户列表"}
​
from fastapi import APIRouter
​
router = APIRouter(
    prefix="/items",
    tags=["商品管理"]  # 文档中归类为「商品管理」
)
​
# 定义商品相关路由
@router.get("/")
def get_all_items():
    return {"message": "获取所有商品列表"}
​
from fastapi import FastAPI
from routers import user, item  # 导入子模块路由
import uvicorn
​
app = FastAPI(title="路由分发示例")
​
# 挂载用户路由:所有 /users 开头的请求由 user.router 处理
app.include_router(user.router)
​
# 挂载商品路由:所有 /items 开头的请求由 item.router 处理
app.include_router(item.router)
​
# 主应用自身也可以定义路由
@app.get("/")
def root():
    return {"message": "欢迎访问主页面"}
​
if __name__ == "__main__":
    # 直接在代码中启动uvicorn服务器
    uvicorn.run(
        app="main:app",       # 指定要运行的FastAPI应用实例
        host="0.0.0.0",  # 允许外部访问(本地可通过127.0.0.1或localhost访问)
        port=8000,     # 端口号
        reload=True    # 开发模式:代码修改后自动重启(生产环境需去掉)
    )
​

五. SQLAlchemy

1.ORM

  • ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,它将数据库中的表结构映射为编程语言中的类,将表中的行映射为类中的对象,让开发者可以用面向对象的方式操作数据库,而无需直接编写 SQL 语句。

  1. 屏蔽数据库差异

    • 同一套代码可适配多种数据库(MySQL、PostgreSQL 等),无需修改核心逻辑

  2. 简化开发流程

    • 用类、对象、方法替代 SQL 语句,降低数据库操作的学习成本

  3. 提高代码可读性

    • 将数据库操作与业务逻辑融合,代码更符合面向对象思维

  4. 自动处理类型转换

    • 无需手动转换数据库字段与Python类型(如MySQL的INT与Python的int)

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐