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