1. 什么是SQLAlchemy?¶
在使用Flask开发Web应用时,我们经常需要与数据库交互(如存储用户信息、商品数据等)。直接写SQL语句虽然可行,但对初学者不够友好,且不同数据库(如MySQL、PostgreSQL)的语法差异大。SQLAlchemy是Python中最流行的ORM(对象关系映射)工具,它允许我们用Python类和对象操作数据库,无需编写原始SQL,同时支持多种数据库(SQLite、MySQL、PostgreSQL等)。
2. 安装依赖¶
要在Flask中使用SQLAlchemy,需先安装两个库:
- Flask:Flask框架核心
- Flask-SQLAlchemy:Flask的SQLAlchemy扩展
在终端执行:
pip install flask flask-sqlalchemy
如果使用SQLite(无需额外安装驱动,适合测试),直接安装上述依赖即可。若使用MySQL或PostgreSQL,需额外安装对应驱动(如pymysql或psycopg2-binary)。
3. 初始化Flask与SQLAlchemy¶
首先创建一个Flask应用,并配置SQLAlchemy连接数据库。
示例代码:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 1. 创建Flask应用
app = Flask(__name__)
# 2. 配置数据库连接(SQLite为例,路径为相对路径,会自动创建test.db文件)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
# 关闭SQLAlchemy的修改跟踪功能(可选,减少性能开销)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 3. 初始化SQLAlchemy,传入Flask应用
db = SQLAlchemy(app)
4. 定义数据模型¶
SQLAlchemy通过类定义数据库表,每个类对应一张表,类属性对应表字段。
示例:定义User表
class User(db.Model):
# 表名默认为类名小写,可自定义:__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True, autoincrement=True) # 主键,自增整数
username = db.Column(db.String(80), unique=True, nullable=False) # 用户名,字符串,唯一且不可空
email = db.Column(db.String(120), unique=True, nullable=False) # 邮箱,唯一且不可空
def __repr__(self): # 打印对象时的格式(方便调试)
return f'<User {self.username}>'
字段类型与约束:
- db.Integer:整数(如主键ID)
- db.String(length):字符串(需指定长度,如String(80))
- primary_key=True:设为主键(唯一标识每条记录)
- unique=True:字段值唯一(如用户名、邮箱)
- nullable=False:字段不可为空
- autoincrement=True:主键自增(整数类型常用)
5. 创建数据库表¶
定义好模型后,需将模型转换为数据库表。通过db.create_all()实现,需在应用上下文中执行。
代码示例:
# 确保在正确的Python环境中执行(若在单独脚本中,需导入app和db)
from app import app, db # 假设上述代码在app.py中
with app.app_context(): # 进入应用上下文(Flask 2.0+ 必须)
db.create_all() # 根据模型创建数据库表
执行后,项目根目录会生成test.db文件(SQLite),表结构与User类对应。
6. 基本操作(CRUD)¶
CRUD即增(Create)、删(Delete)、改(Update)、查(Read),是数据库操作的核心。
6.1 新增数据(Create)¶
通过创建模型实例,添加到会话(session)并提交。
示例:
from app import app, db, User # 导入模型
with app.app_context():
# 创建用户实例
user = User(username='Alice', email='alice@example.com')
# 添加到会话
db.session.add(user)
# 提交会话(执行SQL插入)
db.session.commit()
6.2 查询数据(Read)¶
通过query对象查询数据,支持多种条件。
示例:
with app.app_context():
# 1. 查询所有用户
all_users = User.query.all() # 返回列表
print(all_users) # 输出:[<User Alice>, ...]
# 2. 按条件查询(如查用户名=Alice的用户)
alice = User.query.filter_by(username='Alice').first() # 返回单个对象
print(alice.email) # 输出:alice@example.com
# 3. 按ID查询(主键查询)
user_by_id = User.query.get(1) # 假设ID=1是Alice
print(user_by_id.username) # 输出:Alice
6.3 修改数据(Update)¶
先查询到目标对象,修改属性后提交。
示例:
with app.app_context():
# 查询用户
alice = User.query.filter_by(username='Alice').first()
# 修改邮箱
alice.email = 'alice_new@example.com'
# 提交修改
db.session.commit()
6.4 删除数据(Delete)¶
查询到目标对象,删除后提交。
示例:
with app.app_context():
# 查询用户
alice = User.query.filter_by(username='Alice').first()
# 删除对象
db.session.delete(alice)
# 提交删除
db.session.commit()
7. 总结¶
通过SQLAlchemy操作数据库的核心流程:
1. 配置Flask与SQLAlchemy连接;
2. 定义数据模型(对应数据库表);
3. 用db.create_all()创建表;
4. 通过db.session执行CRUD操作。
SQLAlchemy的优势是无需写SQL,用Python对象直接操作,适合快速开发和维护。初学者可先掌握单表的基础操作,后续再学习多表关联(如外键、关系字段)。