Appearance
SQLAlchemy
- SQLAlchemy = SQL + Alchemy,整体寓意是“用炼金术般的方式处理 SQL”,即通过高级抽象(如 ORM)让数据库操作变得更简单、优雅和强大。
- Alchemy,意为
炼金术,发音接近艾尔可米 - SQLAlchemy 是 Python 中一个功能强大且广泛使用的 ORM(对象关系映射,Object-Relational Mapping)库,用于在 Python 代码中操作关系型数据库(如 PostgreSQL、MySQL、SQLite、Oracle 等),而无需直接编写原始 SQL 语句。
1. ORM 层(高级 API)
将数据库表映射为 Python 类(称为“模型”)。
表中的每一行记录对应一个类的实例。
通过操作对象来完成增删改查,例如:
pythonuser = User(name="张三", email="zhangsan@example.com") session.add(user) session.commit()自动处理 SQL 生成、参数绑定、事务管理等。
2. Core 层(低级 API)
- 提供更接近 SQL 的表达式语言(SQL Expression Language)。
- 允许构建类型安全、可组合的 SQL 查询,但比原生 SQL 更具可读性和可移植性。
- 适合需要精细控制查询性能或复杂 SQL 的场景。
3. 数据库无关性
- 支持多种数据库后端,切换数据库通常只需更改连接字符串。
- 自动生成符合目标数据库语法的 SQL。
4. 与 Web 框架集成良好
- 常与 FastAPI、Flask、Django(通过扩展)等框架配合使用。
- 在 FastAPI 项目中,常结合
pydantic模型与 SQLAlchemy 模型实现请求验证与数据持久化分离。
与 Hibernate 对比
SQLAlchemy 和 Hibernate 在功能定位上非常相似,都是各自语言生态中主流的 ORM(对象关系映射)框架。它们都允许开发者用面向对象的方式操作关系型数据库,避免直接写大量 SQL,同时提供缓存、事务管理、懒加载、关联映射等高级功能。
- SQLAlchemy 是 Python 的 ORM 工具;
- Hibernate 是 Java 的 ORM 框架(后来成为 JPA 规范的事实参考实现)。
二者没有直接关联,但可以说 SQLAlchemy 在某种程度上受到了 Hibernate 等早期 ORM 的启发,但它是独立实现的,并发展出了自己独特的架构(如 Core + ORM 双层设计)。
二者设计理念不同(Hibernate 更“约定优于配置”,SQLAlchemy 更偏向“显式优于隐式”)。
显式优于隐式
代码的行为应该清晰、直接地表达出来,而不是依赖隐藏的规则、魔法般的自动推断或难以察觉的副作用。
- Explicit is better than implicit,是 Python 语言设计哲学的核心原则之一,出自《Python 之禅》(The Zen of Python),由 Tim Peters 撰写。你可以在 Python 中运行
import this查看全文。
普通代码中示例
- ❌ 隐式(不推荐)
python
# 假设有一个函数,它偷偷修改了全局变量
def add_item(item):
global items
items.append(item) # 但函数签名没体现这一点!
add_item("apple")
# 你不知道 `items` 被改了,除非去看函数内部- ✅ 显式(推荐)
python
def add_item(items, item):
return items + [item] # 或者明确传入并修改
my_list = []
my_list = add_item(my_list, "apple") # 清楚知道 my_list 被更新了SQLAlchemy 中代码示例
- ❌ 隐式风格(类似某些 ORM 的“魔法”)
python
# 某些框架可能这样:保存对象时自动触发数据库操作
user.name = "张三"
# 然后……突然就存进数据库了?什么时候 commit 的?- ✅ SQLAlchemy 的显式风格
python
user.name = "张三"
session.add(user)
session.commit() # 明确告诉程序:“现在提交到数据库”- SQLAlchemy 不会偷偷帮你提交事务或自动同步对象状态(除非你主动配置),所有关键操作都需要你明确写出,这就是“显式优于隐式”的体现。
显式优于隐式的优点
- 可读性:别人(或未来的你)能快速理解代码做了什么。
- 可维护性:减少“魔法”带来的意外行为(比如你以为没保存,结果自动保存了)。
- 调试友好:错误更容易定位,因为每一步都是可见的。
pandas
pandas是 Python 中一个非常强大且广泛使用的数据处理与分析库。pandas 的设计目标是为 Python 提供类似 电子表格(如 Excel)或数据库表 的结构化数据操作能力,特别适合用于:
- 数据清洗
- 数据探索(EDA)
- 数据转换
- 时间序列分析
- 统计分析
它的两个核心数据结构是:
Series:一维带标签的数组(类似单列数据)DataFrame:二维表格型数据结构(类似 Excel 表或 SQL 表)
为什么 pandas 能“执行 SQL”?
pandas 本身不直接执行 SQL 语句,但它提供了类似 SQL 的操作方式,比如:
| SQL 操作 | pandas 等价操作 |
|---|---|
SELECT | df[['col1', 'col2']] |
WHERE | df[df['age'] > 30] |
GROUP BY | df.groupby('category').sum() |
JOIN | pd.merge(df1, df2, on='id') |
ORDER BY | df.sort_values('name') |
此外,pandas 还支持通过 pd.read_sql() 从数据库(如 SQLite、MySQL、PostgreSQL)中直接读取 SQL 查询结果,但这需要配合数据库连接(如 sqlite3 或 SQLAlchemy),并不是 pandas 自己在“执行 SQL”,而是调用数据库引擎执行后把结果转成 DataFrame。
pandas 的主要功能概览
数据读写
- 支持格式:CSV、Excel、JSON、HTML、Parquet、SQL、HDF5 等
- 示例:
pd.read_csv('file.csv'),df.to_excel('output.xlsx')
数据清洗
- 处理缺失值(
dropna(),fillna()) - 去重(
drop_duplicates()) - 类型转换(
astype()) - 字符串处理(
str.contains(),str.replace())
- 处理缺失值(
数据筛选与索引
- 条件筛选、布尔索引
loc/iloc精准定位行/列
分组聚合(GroupBy)
- 类似 SQL 的
GROUP BY+ 聚合函数(sum,mean,count等)
- 类似 SQL 的
合并与连接
concat(),merge(),join()实现表连接
时间序列支持
- 日期解析、重采样(
resample)、移动窗口(rolling)
- 日期解析、重采样(
统计与描述
describe(),corr(),value_counts()等快速统计
可视化(基础)
- 内置基于 Matplotlib 的绘图:
df.plot(),df.hist()
- 内置基于 Matplotlib 的绘图:
Gradio
Gradio 是一个开源的 Python 库,旨在帮助开发者、数据科学家和机器学习工程师快速构建交互式 Web 界面,用于演示机器学习模型、API 或任意 Python 函数 。
它的主要特点:
- 简单易用:只需几行代码即可为模型或函数创建图形用户界面(GUI),无需前端开发经验 。
- 快速原型:非常适合快速搭建 AI 模型的演示界面,便于在团队内部或对外展示时进行交互测试 。
- 广泛支持输入/输出组件:提供图像、文本、音频、视频、文件上传等多种 UI 组件,可灵活适配不同任务需求 。
- 本地与云端部署:既可以在本地运行,也支持一键部署到 Hugging Face Spaces 等平台,实现公开分享 。
- 与主流框架兼容:无缝集成 PyTorch、TensorFlow、scikit-learn、OpenCV、Transformers 等常用库 。
mysql-connector-python
Python 中用于连接 MySQL 的官方驱动并不是叫
mysql,而是mysql-connector-python或PyMySQL。
pip install mysql安装的是一个早已废弃、不维护的老包(甚至可能根本安装失败),它不能提供 mysql.connector 模块,也不能连接 MySQL 数据库。pip install mysql-connector-python安装的是 MySQL 官方推荐的驱动,它提供了 mysql.connector 模块,用于连接 MySQL 数据库。pip install PyMySQL安装的是另一个常用的 MySQL 驱动,它也提供了 mysql.connector 模块,用于连接 MySQL 数据库。- 这两个驱动的主要区别在于:
mysql-connector-python是 MySQL 官方推荐的驱动,功能完善,性能稳定。PyMySQL是一个纯 Python 实现的驱动,功能与mysql-connector-python类似,但可能在某些场景下性能稍差。- 如果代码用的是
mysql+mysqlconnector://user:password@host/db,就必须用mysql-connector-python。 - 如果代码用的是
mysql+pymysql://user:password@host/db,就必须用PyMySQL。
tabulate
tabulate 是一个 Python 第三方库,用于将 表格数据(如列表、字典、Pandas DataFrame 等)以美观、对齐的文本形式打印出来,常用于命令行工具、日志输出或调试时展示结构化数据。
比如你有如下数据
pythondata = [ ["Alice", 25, "Engineer"], ["Bob", 30, "Designer"] ] headers = ["Name", "Age", "Job"]
使用 tabulate 可以输出成这样:
markdown
Name Age Job
------ --- --------
Alice 25 Engineer
Bob 30 Designer- 支持多种格式:
plain,grid,pipe(Markdown 表格),html,psql,jira等。
if __name__ == '__main__':
- 这行代码是 Python 中的一个
条件判断语句,用于 判断当前模块是否作为主程序直接运行 ,而不是被其他模块导入。具体来说:__name__是 Python 模块的内置变量,表示当前模块的名称- 当模块被直接运行时,
__name__的值会被设置为__main__ - 当模块被其他模块导入时,
__name__的值会是模块的实际名称(即文件名,不含.py后缀,如文件名是my_module.py,则__name__的值为my_module) - 因此, if
__name__== '__main__': 条件成立时,执行其下方的代码块