Flask数据库操作 #
一、创建数据 #
1.1 添加单条记录 #
python
from app import db
from models import User
user = User(username='zhangsan', email='zhangsan@example.com')
db.session.add(user)
db.session.commit()
1.2 添加多条记录 #
python
users = [
User(username='user1', email='user1@example.com'),
User(username='user2', email='user2@example.com'),
User(username='user3', email='user3@example.com')
]
db.session.add_all(users)
db.session.commit()
二、查询数据 #
2.1 基本查询 #
python
# 查询所有
users = User.query.all()
# 根据主键查询
user = User.query.get(1)
user = User.query.get_or_404(1)
# 根据条件查询
user = User.query.filter_by(username='zhangsan').first()
users = User.query.filter(User.username == 'zhangsan').all()
2.2 过滤查询 #
python
# 等于
User.query.filter(User.username == 'zhangsan')
# 不等于
User.query.filter(User.username != 'zhangsan')
# LIKE
User.query.filter(User.username.like('%zhang%'))
# IN
User.query.filter(User.username.in_(['zhangsan', 'lisi']))
# IS NULL
User.query.filter(User.email == None)
User.query.filter(User.email.is_(None))
# IS NOT NULL
User.query.filter(User.email != None)
User.query.filter(User.email.isnot(None))
# 范围
User.query.filter(User.age.between(18, 30))
2.3 逻辑运算 #
python
from sqlalchemy import and_, or_, not_
# AND
User.query.filter(and_(User.age > 18, User.active == True))
User.query.filter(User.age > 18, User.active == True)
# OR
User.query.filter(or_(User.age < 18, User.age > 60))
# NOT
User.query.filter(not_(User.active))
2.4 排序和限制 #
python
# 排序
User.query.order_by(User.created_at.desc())
User.query.order_by(User.age.asc(), User.username)
# 限制数量
User.query.limit(10).all()
User.query.offset(10).limit(10).all()
2.5 聚合函数 #
python
from sqlalchemy import func
# 计数
count = User.query.count()
count = db.session.query(func.count(User.id)).scalar()
# 求和
total = db.session.query(func.sum(User.age)).scalar()
# 平均值
avg = db.session.query(func.avg(User.age)).scalar()
# 最大值
max_age = db.session.query(func.max(User.age)).scalar()
# 最小值
min_age = db.session.query(func.min(User.age)).scalar()
三、更新数据 #
3.1 更新单条记录 #
python
user = User.query.get(1)
user.username = 'newname'
db.session.commit()
3.2 批量更新 #
python
User.query.filter(User.active == False).update({'active': True})
db.session.commit()
四、删除数据 #
4.1 删除单条记录 #
python
user = User.query.get(1)
db.session.delete(user)
db.session.commit()
4.2 批量删除 #
python
User.query.filter(User.active == False).delete()
db.session.commit()
五、分页 #
5.1 使用paginate #
python
page = request.args.get('page', 1, type=int)
per_page = request.args.get('per_page', 10, type=int)
pagination = User.query.paginate(page=page, per_page=per_page)
users = pagination.items
# 分页属性
pagination.total # 总记录数
pagination.pages # 总页数
pagination.page # 当前页
pagination.per_page # 每页数量
pagination.has_prev # 是否有上一页
pagination.has_next # 是否有下一页
pagination.prev_num # 上一页页码
pagination.next_num # 下一页页码
5.2 模板中使用 #
html
{% for user in users %}
<p>{{ user.username }}</p>
{% endfor %}
{% if pagination.has_prev %}
<a href="{{ url_for('users', page=pagination.prev_num) }}">上一页</a>
{% endif %}
<span>{{ pagination.page }} / {{ pagination.pages }}</span>
{% if pagination.has_next %}
<a href="{{ url_for('users', page=pagination.next_num) }}">下一页</a>
{% endif %}
六、下一步 #
接下来让我们学习 数据库迁移,了解如何管理数据库变更!
最后更新:2026-03-28