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 即可体验完整的数据库操作流程。
---
喜欢本文?不要错过✨,点赞👍收藏⭐关注我👆,一起学习更多有用的知识,完善你我的技能树!
浙公网安备 33010602011771号