Flask与数据库连接:SQLAlchemy基础操作

1. 什么是SQLAlchemy?

在使用Flask开发Web应用时,我们经常需要与数据库交互(如存储用户信息、商品数据等)。直接写SQL语句虽然可行,但对初学者不够友好,且不同数据库(如MySQL、PostgreSQL)的语法差异大。SQLAlchemy是Python中最流行的ORM(对象关系映射)工具,它允许我们用Python类和对象操作数据库,无需编写原始SQL,同时支持多种数据库(SQLite、MySQL、PostgreSQL等)。

2. 安装依赖

要在Flask中使用SQLAlchemy,需先安装两个库:
- Flask:Flask框架核心
- Flask-SQLAlchemy:Flask的SQLAlchemy扩展

在终端执行:

pip install flask flask-sqlalchemy

如果使用SQLite(无需额外安装驱动,适合测试),直接安装上述依赖即可。若使用MySQL或PostgreSQL,需额外安装对应驱动(如pymysqlpsycopg2-binary)。

3. 初始化Flask与SQLAlchemy

首先创建一个Flask应用,并配置SQLAlchemy连接数据库。

示例代码

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# 1. 创建Flask应用
app = Flask(__name__)

# 2. 配置数据库连接(SQLite为例,路径为相对路径,会自动创建test.db文件)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
# 关闭SQLAlchemy的修改跟踪功能(可选,减少性能开销)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 3. 初始化SQLAlchemy,传入Flask应用
db = SQLAlchemy(app)

4. 定义数据模型

SQLAlchemy通过定义数据库表,每个类对应一张表,类属性对应表字段。

示例:定义User表

class User(db.Model):
    # 表名默认为类名小写,可自定义:__tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True, autoincrement=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}>'

字段类型与约束
- db.Integer:整数(如主键ID)
- db.String(length):字符串(需指定长度,如String(80)
- primary_key=True:设为主键(唯一标识每条记录)
- unique=True:字段值唯一(如用户名、邮箱)
- nullable=False:字段不可为空
- autoincrement=True:主键自增(整数类型常用)

5. 创建数据库表

定义好模型后,需将模型转换为数据库表。通过db.create_all()实现,需在应用上下文中执行。

代码示例

# 确保在正确的Python环境中执行(若在单独脚本中,需导入app和db)
from app import app, db  # 假设上述代码在app.py中

with app.app_context():  # 进入应用上下文(Flask 2.0+ 必须)
    db.create_all()  # 根据模型创建数据库表

执行后,项目根目录会生成test.db文件(SQLite),表结构与User类对应。

6. 基本操作(CRUD)

CRUD即增(Create)、删(Delete)、改(Update)、查(Read),是数据库操作的核心。

6.1 新增数据(Create)

通过创建模型实例,添加到会话(session)并提交。

示例

from app import app, db, User  # 导入模型

with app.app_context():
    # 创建用户实例
    user = User(username='Alice', email='alice@example.com')
    # 添加到会话
    db.session.add(user)
    # 提交会话(执行SQL插入)
    db.session.commit()
6.2 查询数据(Read)

通过query对象查询数据,支持多种条件。

示例

with app.app_context():
    # 1. 查询所有用户
    all_users = User.query.all()  # 返回列表
    print(all_users)  # 输出:[<User Alice>, ...]

    # 2. 按条件查询(如查用户名=Alice的用户)
    alice = User.query.filter_by(username='Alice').first()  # 返回单个对象
    print(alice.email)  # 输出:alice@example.com

    # 3. 按ID查询(主键查询)
    user_by_id = User.query.get(1)  # 假设ID=1是Alice
    print(user_by_id.username)  # 输出:Alice
6.3 修改数据(Update)

先查询到目标对象,修改属性后提交。

示例

with app.app_context():
    # 查询用户
    alice = User.query.filter_by(username='Alice').first()
    # 修改邮箱
    alice.email = 'alice_new@example.com'
    # 提交修改
    db.session.commit()
6.4 删除数据(Delete)

查询到目标对象,删除后提交。

示例

with app.app_context():
    # 查询用户
    alice = User.query.filter_by(username='Alice').first()
    # 删除对象
    db.session.delete(alice)
    # 提交删除
    db.session.commit()

7. 总结

通过SQLAlchemy操作数据库的核心流程:
1. 配置Flask与SQLAlchemy连接;
2. 定义数据模型(对应数据库表);
3. 用db.create_all()创建表;
4. 通过db.session执行CRUD操作。

SQLAlchemy的优势是无需写SQL,用Python对象直接操作,适合快速开发和维护。初学者可先掌握单表的基础操作,后续再学习多表关联(如外键、关系字段)。

小夜