Flask数据库操作:SQLAlchemy ORM基础教程

为什么需要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():定义字段,参数包括数据类型(如IntegerString)、约束(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()
  • 注意:必须先addcommit,否则数据不会写入数据库
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)。更多高级特性(如关系模型、关联查询)可后续探索~

小夜