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
模型,包含 id
、username
和 email
字段:
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的小宝同学”