Flask数据库操作三步曲:连接、建模与CRUD实战

写了几十个Flask视图函数,数据却还写在TXT文件里?恭喜你,你的项目正卡在从玩具到产品的关键一步!据统计,超过70%的Flask初学者在首次集成数据库时会感到困惑甚至放弃。

本文你将学到:

1. 为什么Flask应用需要ORM这个“翻译官”

2. 三步搞定数据库连接与模型定义

3. 清晰演示增删改查(CRUD)核心操作

阅读指南:本文假设你已有基础Flask知识,将带你平滑过渡到数据库世界。

📚 目录

- ✨ 第一步:为什么选SQLAlchemy?

- 🚀 第二步:连接数据库与定义模型

- 📝 第三步:核心CRUD操作实战

- 💾 完整代码参考与总结

✨ 第一步:为什么选SQLAlchemy?

在Flask中直接写SQL语句就像用手动挡开车——有控制感但效率低。而SQLAlchemy作为Python最强大的ORM(对象关系映射)工具之一,就是你的“自动变速箱”。

ORM的核心价值在于:让你用操作Python对象的方式(类、实例、属性)来操作数据库表,无需关心底层SQL方言的差异。对于Flask,我们通常使用其简化版——Flask-SQLAlchemy扩展。

🚀 第二步:连接数据库与定义模型

万事开头难,但配置其实就三步:安装、连接、定义。

1. 安装与基础配置

# 安装必要的包
# pip install flask-sqlalchemy
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
# 配置数据库URI(这里使用SQLite作为示例)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关闭警告

# 创建数据库对象
db = SQLAlchemy(app)

2. 定义你的第一个数据模型

模型(Model)对应数据库中的一张表。我们来定义一个User(用户)模型:

class User(db.Model):
    # 定义表名(可选,默认会转小写)
    __tablename__ = 'users'

    # 定义字段(列)
    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)
    date_created = db.Column(db.DateTime, default=db.func.now()) # 默认当前时间

    # 可选:定义友好显示对象的方式
    def __repr__(self):
        return f'<User {self.username}>'

关键点db.Column定义了字段类型和约束(如唯一、非空)。定义好模型后,只需一行命令即可创建实际的数据表:

with app.app_context():
    db.create_all() # 根据所有模型类创建表

📝 第三步:核心CRUD操作实战

CRUD(Create, Read, Update, Delete)是数据库操作的基石。掌握它们,你就掌握了八成日常需求。

C - 创建数据

# 1. 创建对象实例
new_user = User(username='小张', email='zhang@example.com')

# 2. 添加到会话(暂存)
db.session.add(new_user)

# 3. 提交到数据库(永久保存)
db.session.commit()
print(f'用户 {new_user.username} 创建成功,ID为 {new_user.id}')

R - 查询数据(招式最多)

# 查询所有用户
all_users = User.query.all()

# 根据主键查询单个用户
user_by_id = User.query.get(1)

# 根据条件过滤查询(常用!)
user_zhang = User.query.filter_by(username='小张').first()
users_with_gmail = User.query.filter(User.email.like('%gmail.com')).all()

# 更复杂的查询与排序
recent_users = User.query.order_by(User.date_created.desc()).limit(5).all()

U - 更新数据

# 1. 先查询到要更新的对象
user_to_update = User.query.get(1)

# 2. 修改属性
if user_to_update:
    user_to_update.email = 'new_email@example.com'
    # 3. 提交更改(无需再次add,对象已在会话中)
    db.session.commit()
    print('用户信息已更新')

D - 删除数据

# 1. 查询到要删除的对象
user_to_delete = User.query.get(2)

# 2. 删除并提交
if user_to_delete:
    db.session.delete(user_to_delete)
    db.session.commit()
    print('用户已删除')

重要提示:所有修改数据库的操作(增、删、改),最后都必须执行db.session.commit()才会生效!db.session.add()只是将对象放入临时“购物车”。

💾 完整代码参考与总结

将以上步骤整合到一个简单的app.py中:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///myapp.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)
    date_created = db.Column(db.DateTime, default=datetime.utcnow)

    def __repr__(self):
        return f'<User {self.username}>'

# 初始化数据库(仅在第一次运行时创建表)
@app.before_first_request
def create_tables():
    db.create_all()

# 一个简单的路由测试
@app.route('/add_user/<name>/<email>')
def add_user(name, email):
    try:
        new_user = User(username=name, email=email)
        db.session.add(new_user)
        db.session.commit()
        return f'用户 {name} 添加成功!'
    except Exception as e:
        return f'添加失败:{str(e)}'

@app.route('/users')
def show_users():
    users = User.query.all()
    return {'users': [{'id': u.id, 'name': u.username, 'email': u.email} for u in users]}

if __name__ == '__main__':
    app.run(debug=True)

运行后,访问 /add_user/你的名字/你的邮箱/users 即可体验完整的数据库操作流程。

---

喜欢本文?不要错过✨,点赞👍收藏⭐关注我👆,一起学习更多有用的知识,完善你我的技能树!

posted @ 2025-12-09 08:23  曲幽  阅读(19)  评论(0)    收藏  举报