5 数据库操作

Flask-SQLAlchemy 是 Flask 推荐的 ORM(对象关系映射)扩展,它基于 SQLAlchemy,能够让我们用 Python 代码操作数据库,而不必手写 SQL 语句。本教程将介绍 Flask-SQLAlchemy 的使用,包括:

  • 连接 PostgreSQL 数据库
  • 定义数据库模型
  • 数据库迁移(Flask-Migrate)
  • 增删改查(CRUD)操作

1. 安装依赖

我们首先安装 Flask-SQLAlchemy 及 PostgreSQL 驱动程序 psycopg2(或 psycopg2-binary):

pip install flask-sqlalchemy psycopg2 flask-migrate

2. 连接 PostgreSQL 数据库

Flask-SQLAlchemy 配置

app.py 文件中,配置数据库连接:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# PostgreSQL 连接字符串格式:
# postgresql://用户名:密码@主机:端口/数据库名
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://username:password@localhost:5432/mydatabase'

# 关闭 SQLAlchemy 事件系统(可提升性能)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

确保 PostgreSQL 服务已启动,并创建了 mydatabase 数据库:

CREATE DATABASE mydatabase;

3. 定义数据库模型

定义一个 User 模型,包含 idusernameemail 字段:

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)

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

4. 数据库迁移

数据库迁移可以在不删除已有数据的情况下,更新数据库结构。我们使用 Flask-Migrate 来管理数据库迁移。

4.1 初始化数据库迁移

app.py 中,添加 Flask-Migrate:

from flask_migrate import Migrate

migrate = Migrate(app, db)

然后运行以下命令初始化迁移环境:

flask db init

4.2 创建迁移脚本

flask db migrate -m "Initial migration"

这将生成 migrations/versions 目录,其中包含数据库变更的脚本。

4.3 执行数据库迁移

flask db upgrade

这会将定义的 User 模型同步到 PostgreSQL 数据库。


5. 数据库增删改查(CRUD 操作)

5.1 创建用户(Create)

@app.route('/add_user')
def add_user():
    new_user = User(username='alice', email='alice@example.com')
    db.session.add(new_user)
    db.session.commit()
    return 'User added successfully!'

5.2 查询用户(Read)

查询所有用户

@app.route('/users')
def get_users():
    users = User.query.all()
    return {user.id: user.username for user in users}

查询单个用户

@app.route('/user/<int:id>')
def get_user(id):
    user = User.query.get(id)
    if user:
        return f'User: {user.username}, Email: {user.email}'
    return 'User not found'

5.3 更新用户(Update)

@app.route('/update_user/<int:id>')
def update_user(id):
    user = User.query.get(id)
    if user:
        user.email = 'newemail@example.com'
        db.session.commit()
        return 'User updated successfully!'
    return 'User not found'

5.4 删除用户(Delete)

@app.route('/delete_user/<int:id>')
def delete_user(id):
    user = User.query.get(id)
    if user:
        db.session.delete(user)
        db.session.commit()
        return 'User deleted successfully!'
    return 'User not found'

6. 事务处理及异常捕获

在实际应用中,可能会遇到数据库操作失败的情况(如违反唯一性约束)。我们可以使用 try-except 来处理异常:

from sqlalchemy.exc import IntegrityError

@app.route('/safe_add_user')
def safe_add_user():
    try:
        user = User(username='bob', email='bob@example.com')
        db.session.add(user)
        db.session.commit()
        return 'User added successfully!'
    except IntegrityError:
        db.session.rollback()
        return 'Error: Username or email already exists!'

7. 关闭数据库连接

虽然 Flask-SQLAlchemy 会自动管理数据库连接,但在某些情况下,手动关闭连接是个好习惯:

@app.teardown_appcontext
def shutdown_session(exception=None):
    db.session.remove()

更多请关注wx公众号 “学GIS的小宝同学”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值