Python 数据库操作神器,一文掌握 ORM!

开发
SQLAlchemy 是 Python 最强大的 ORM 框架,支持 MySQL、PostgreSQL、SQLite、SQL Server 等数据库。本篇文章带你 从入门到实战,彻底掌握 SQLAlchemy!

你是否遇到这些问题?

  • 还在手写 SQL?数据库操作太麻烦?
  • Django ORM 用过,但想在 Flask 中也用 ORM?
  • SQLAlchemy 怎么连接数据库?如何查询数据?

SQLAlchemy 是 Python 最强大的 ORM 框架,支持 MySQL、PostgreSQL、SQLite、SQL Server 等数据库。本篇文章带你 从入门到实战,彻底掌握 SQLAlchemy!

1. 什么是 SQLAlchemy?为什么要用 ORM?

SQLAlchemy 是 Python 的 ORM(对象关系映射)框架,可以用 Python 代码 直接操作数据库,而 不需要写 SQL。

为什么要用 ORM?

  • 数据库操作更 Pythonic(面向对象)
  • 兼容多种数据库(MySQL、PostgreSQL、SQLite 等)
  • 自动生成 SQL,避免 SQL 注入风险
  • 更易维护,代码比 SQL 语句更清晰

传统 SQL 操作(手写 SQL):

import sqlite3

conn = sqlite3.connect("test.db")
cursor = conn.cursor()
cursor.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")
cursor.execute("INSERT INTO users (name, age) VALUES ('Alice', 25)")
conn.commit()
cursor.close()
conn.close()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

SQLAlchemy 操作(ORM 方式):

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker

engine = create_engine("sqlite:///test.db")
Base = declarative_base()

classUser(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)
session = Session()

new_user = User(name="Alice", age=25)
session.add(new_user)
session.commit()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

SQLAlchemy 让数据库操作更清晰、更 Pythonic!

2. 安装 & 配置 SQLAlchemy

(1) 安装 SQLAlchemy

pip install sqlalchemy
  • 1.

如果使用 MySQL,需要额外安装 MySQL 驱动:

pip install pymysql
  • 1.

(2) 创建数据库连接

from sqlalchemy import create_engine

# 连接 SQLite
engine = create_engine("sqlite:///test.db")

# 连接 MySQL(需要安装 pymysql)
# engine = create_engine("mysql+pymysql://user:password@localhost/dbname")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

SQLAlchemy 通过 create_engine() 统一管理数据库连接!

3. 创建 ORM 模型(定义数据表)

定义一个 User 表:

from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)
    age = Column(Integer)

# 创建表
Base.metadata.create_all(engine)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

ORM 方式定义表结构,避免手写 SQL !

4. CRUD 操作(增删改查)

(1) 创建数据库会话

from sqlalchemy.orm import sessionmaker

Session = sessionmaker(bind=engine)
session = Session()
  • 1.
  • 2.
  • 3.
  • 4.

所有数据库操作都通过 session 进行!

(2) 插入数据(Create)

new_user = User(name="Alice", age=25)
session.add(new_user)
session.commit()
  • 1.
  • 2.
  • 3.

使用 session.add() 添加新数据,commit() 提交!

(3) 查询数据(Read)

  • 查询所有用户
users = session.query(User).all()
for user in users:
    print(user.id, user.name, user.age)
  • 1.
  • 2.
  • 3.
  • 按条件查询
user = session.query(User).filter_by(name="Alice").first()
print(user.id, user.name, user.age)
  • 1.
  • 2.
  • 多条件查询
from sqlalchemy import and_, or_

# 年龄 > 20 且姓名是 Alice
users = session.query(User).filter(and_(User.age > 20, User.name == "Alice")).all()

# 年龄 > 20 或 姓名是 Alice
users = session.query(User).filter(or_(User.age > 20, User.name == "Alice")).all()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

filter() 方式类似 SQL WHERE 语句!

(4) 更新数据(Update)

user = session.query(User).filter_by(name="Alice").first()
user.age = 30
session.commit()
  • 1.
  • 2.
  • 3.

直接修改对象属性,再 commit() 保存!

(5) 删除数据(Delete)

user = session.query(User).filter_by(name="Alice").first()
session.delete(user)
session.commit()
  • 1.
  • 2.
  • 3.

使用 session.delete() 删除对象!

5. 进阶操作:一对多 & 多对多

(1) 一对多关系(User → Post)

from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship

class Post(Base):
    __tablename__ = "posts"
    id = Column(Integer, primary_key=True)
    title = Column(String(100))
    user_id = Column(Integer, ForeignKey("users.id"))

    user = relationship("User", back_populates="posts")

User.posts = relationship("Post", order_by=Post.id, back_populates="user")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

relationship() 让表之间建立关系,查询时更方便!

(2) 多对多关系(User ↔ Course)

from sqlalchemy import Table

# 关联表
user_course = Table(
    "user_course", Base.metadata,
    Column("user_id", Integer, ForeignKey("users.id")),
    Column("course_id", Integer, ForeignKey("courses.id"))
)

classCourse(Base):
    __tablename__ = "courses"
    id = Column(Integer, primary_key=True)
    name = Column(String(100))

    users = relationship("User", secondary=user_course, back_populates="courses")

User.courses = relationship("Course", secondary=user_course, back_populates="users")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

多对多关系通过 secondary 关联表实现!

6. SQLAlchemy vs 直接写 SQL,哪种更好?

方式

ORM(SQLAlchemy)

手写 SQL

代码可读性

✅ 高,可维护性好

❌ 低,SQL 语句较长

数据库兼容性

✅ 兼容 MySQL、PostgreSQL、SQLite

❌ 需改写 SQL 适配不同数据库

安全性

✅ 避免 SQL 注入

❌ 需手动防 SQL 注入

性能

❌ ORM 有一定性能损耗

✅ SQL 执行更快

开发效率

✅ 高效,操作数据库像操作对象

❌ 需要手写 SQL

  • 小型项目、简单查询 → ORM 更方便!
  • 复杂查询、大数据量操作 → SQL 更高效!

7. 结语:SQLAlchemy 让 Python 操作数据库更简单!

  • ORM 让数据库操作更直观,不用手写 SQL!
  • SQLAlchemy 适用于大部分项目,灵活易用,功能强大!
责任编辑:赵宁宁 来源: Ssoul肥鱼
相关推荐

2023-03-27 16:44:23

2016-12-06 19:46:40

云数据库

2025-04-07 08:20:00

ORMPython代码

2023-10-24 11:44:21

2022-07-28 09:02:41

文件存储系统

2022-12-20 07:39:46

2023-12-21 17:11:21

Containerd管理工具命令行

2022-10-21 17:24:34

契约测试定位

2023-07-14 08:00:00

ORMRust ORMSQL

2023-07-17 10:45:03

向量数据库NumPy

2017-11-28 15:20:27

Python语言编程

2024-11-19 09:00:00

Pythondatetime模块

2020-07-16 07:30:15

数据库SQL技术

2021-05-12 18:22:36

Linux 内存管理

2023-02-13 23:39:48

数据库Mongodb存储

2023-11-29 16:16:14

Redis数据库

2024-01-11 07:32:00

2023-12-26 07:40:34

2021-07-21 09:24:25

MongoDB数据库 Python

2024-12-04 13:02:34

数据库分库分表
点赞
收藏

51CTO技术栈公众号