为什么需要ORM?¶
在Web开发中,数据库操作是核心环节之一。直接写SQL语句虽然灵活,但对于复杂项目来说,维护成本高、代码可读性差。而ORM(对象关系映射)可以将数据库表与Python对象对应起来,让我们用面向对象的方式操作数据库,无需关心底层SQL细节。
SQLAlchemy是Python中最流行的ORM库之一,Flask通过Flask-SQLAlchemy扩展简化了与SQLAlchemy的集成。本文将带你从0开始,掌握Flask+SQLAlchemy的基础数据库操作。
环境准备与安装¶
首先确保安装了必要的库:
pip install flask flask-sqlalchemy
flask:Web框架基础flask-sqlalchemy:Flask与SQLAlchemy的集成扩展
初始化Flask应用与SQLAlchemy¶
创建一个app.py文件,开始配置应用和数据库:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 初始化Flask应用
app = Flask(__name__)
# 配置数据库(以SQLite为例,无需额外安装,文件存储在本地)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db' # 数据库文件路径
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关闭修改跟踪,节省资源
# 初始化SQLAlchemy实例
db = SQLAlchemy(app)
定义数据库模型(Model)¶
ORM的核心是模型类,类名对应数据库表名,类属性对应表字段。以下是一个简单的User模型示例:
class User(db.Model):
# 定义表字段:
id = db.Column(db.Integer, primary_key=True) # 主键,自增
username = db.Column(db.String(80), unique=True, nullable=False) # 用户名,唯一且非空
email = db.Column(db.String(120), unique=True, nullable=False) # 邮箱,唯一且非空
age = db.Column(db.Integer) # 年龄,可选
# 可选:定义对象的字符串表示形式(方便调试)
def __repr__(self):
return f'<User {self.username}>'
db.Column():定义字段,参数包括数据类型(如Integer、String)、约束(unique/nullable)等primary_key=True:设为主键,自动递增db.Model:所有模型类需继承此基类
创建数据库表¶
定义好模型后,需要创建实际的数据库表。在Python交互环境或应用入口处执行:
# 在Flask shell中操作(推荐)
# 1. 打开终端,进入项目目录
# 2. 执行 `flask shell` 进入Python交互环境
# 3. 导入db和模型
from app import db, User
# 创建所有表
db.create_all() # 执行后,mydatabase.db文件会生成,包含User表
- 执行
db.create_all()会自动根据模型类创建表,无需手动写CREATE TABLE语句
基本CRUD操作(创建、读取、更新、删除)¶
数据库操作围绕会话(session) 进行,db.session用于管理事务(提交/回滚)。
1. 创建(Create)数据¶
# 创建新用户
new_user = User(
username="Alice",
email="alice@example.com",
age=25
)
# 添加到会话
db.session.add(new_user)
# 提交事务(保存到数据库)
db.session.commit()
- 注意:必须先
add再commit,否则数据不会写入数据库
2. 读取(Read)数据¶
# 查询所有用户
all_users = User.query.all() # 返回User对象列表
for user in all_users:
print(user.username, user.email)
# 按条件查询(如查询用户名等于Alice的用户)
user = User.query.filter_by(username="Alice").first() # 返回第一个匹配的对象
print(user.email) # 输出:alice@example.com
# 按主键查询
user = User.query.get(1) # id=1的用户(假设Alice是第一个用户)
print(user.age) # 输出:25
filter_by():按字段值筛选(username="Alice")first():返回第一个结果;all():返回所有结果get():按主键快速查询(性能更高)
3. 更新(Update)数据¶
# 查询用户
user = User.query.get(1)
if user:
user.age = 26 # 修改年龄
db.session.commit() # 提交修改
- 修改对象属性后,需
commit才能保存到数据库
4. 删除(Delete)数据¶
# 查询用户
user = User.query.get(1)
if user:
db.session.delete(user) # 从会话中删除对象
db.session.commit() # 提交事务,表中数据被删除
完整示例:Flask应用中的数据库操作¶
将上述步骤整合为一个简单的Flask应用(app.py):
from flask import Flask, render_template_string
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
# 定义模型
class User(db.Model):
id = db.Column(db.Integer, primary_key=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}>'
# 创建表(应用启动时执行)
with app.app_context():
db.create_all()
# 路由示例:显示所有用户
@app.route('/')
def index():
users = User.query.all()
return render_template_string('''
<h1>用户列表</h1>
<ul>
{% for user in users %}
<li>{{ user.username }}: {{ user.email }}</li>
{% endfor %}
</ul>
''', users=users)
# 路由示例:添加新用户(可通过POST请求测试)
@app.route('/add')
def add_user():
new_user = User(username="Bob", email="bob@example.com")
db.session.add(new_user)
db.session.commit()
return "用户添加成功!"
if __name__ == '__main__':
app.run(debug=True)
总结¶
通过SQLAlchemy ORM,我们可以用Python对象直接操作数据库,大幅简化CRUD代码。核心步骤:
1. 初始化db对象,配置数据库
2. 定义模型类,映射表结构
3. 执行db.create_all()创建表
4. 通过db.session进行增删改查操作
初学者可从SQLite开始练习,熟悉后可尝试MySQL/PostgreSQL(只需修改SQLALCHEMY_DATABASE_URI)。更多高级特性(如关系模型、关联查询)可后续探索~