优秀的编程知识分享平台

网站首页 > 技术文章 正文

使用 Flask-SQLAlchemy 进行数据库操作

nanyue 2024-12-13 15:26:37 技术文章 7 ℃

Flask-SQLAlchemy 是 Flask 与 SQLAlchemy ORM 的集成工具,提供了简便的接口来操作数据库。通过它,你可以使用 Python 类定义数据库模型,并进行查询、插入、更新等操作,同时保持数据库和对象之间的同步。

1. 安装 Flask-SQLAlchemy

在开始之前,确保你已经安装了 Flask 和 Flask-SQLAlchemy:

pip install Flask-SQLAlchemy

2. 配置 Flask-SQLAlchemy

首先,需要在 Flask 应用中配置数据库 URI(通常为 SQLAlchemy 所支持的数据库类型,如 SQLite、PostgreSQL、MySQL 等)。你还需要定义 SQLAlchemy 的配置。

示例项目结构

my_flask_app/
│
├── app.py                 # Flask 应用文件
└── mydatabase.db          # SQLite 数据库(可以自动创建)

代码示例

  1. 定义 Flask 应用和 SQLAlchemy
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 配置数据库 URI(这里以 SQLite 为例)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 关闭修改跟踪以减少开销

# 初始化数据库对象
db = SQLAlchemy(app)

# 定义数据库模型(ORM类)
class User(db.Model):
    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}>'

# 创建数据库
@app.before_first_request
def create_tables():
    db.create_all()

@app.route('/')
def index():
    return 'Database is set up!'

if __name__ == '__main__':
    app.run(debug=True)

解释:

  • SQLALCHEMY_DATABASE_URI:指定数据库的 URI,例如使用 SQLite 时为 'sqlite:///mydatabase.db'。你也可以使用其他数据库,如 PostgreSQL、MySQL 等。
    • PostgreSQL: 'postgresql://username:password@localhost/dbname'
    • MySQL: 'mysql://username:password@localhost/dbname'
  • db.ModelUser 类继承自 db.Model,它是一个 SQLAlchemy ORM 模型。每个模型类对应数据库中的一张表。
  • db.Column:定义表中的字段,类型包括 IntegerStringDateTime 等。
  • db.create_all():在应用首次请求之前创建所有表格。确保你在实际应用中只调用一次以避免覆盖现有的表格数据。

3. 执行数据库操作

1. 创建记录

要将新记录插入到数据库中,首先创建一个模型对象并使用 db.session.add() 将其添加到数据库会话中,最后使用 db.session.commit() 提交更改。

@app.route('/add_user')
def add_user():
    # 创建新用户对象
    new_user = User(username='john_doe', email='john@example.com')
    
    # 添加到会话并提交到数据库
    db.session.add(new_user)
    db.session.commit()
    
    return 'User added!'

2. 查询记录

Flask-SQLAlchemy 提供了多种方式查询数据库,包括使用 query 属性进行查询。

@app.route('/get_users')
def get_users():
    # 查询所有用户
    users = User.query.all()  # 返回所有用户列表
    return f"Users: {[user.username for user in users]}"

你还可以使用条件查询、排序等功能:

# 获取单个用户
user = User.query.filter_by(username='john_doe').first()

# 使用条件查询
user = User.query.filter(User.username == 'john_doe').first()

# 按照某个字段排序
users = User.query.order_by(User.username).all()

3. 更新记录

要更新数据库中的记录,首先需要获取该记录,然后修改属性并提交会话:

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

4. 删除记录

要删除数据库中的记录,使用 db.session.delete() 删除并提交会话:

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

4. 使用 Flask-Migrate 进行数据库迁移

随着应用的发展,数据库模型可能会发生变化。为了处理模型的更改,Flask 提供了一个扩展 Flask-Migrate 来帮助管理数据库迁移。

安装 Flask-Migrate

pip install Flask-Migrate

配置 Flask-Migrate

  1. app.py 中配置 Flask-Migrate
from flask_migrate import Migrate

# 初始化 Flask-Migrate
migrate = Migrate(app, db)
  1. 使用迁移命令

首先,初始化迁移仓库:

flask db init

创建迁移文件:

flask db migrate -m "Initial migration"

执行迁移,将更改应用到数据库:

flask db upgrade

5. 处理关系(外键、多对多关系)

SQLAlchemy 支持表与表之间的关系,例如一对多、多对多等。

一对多关系

假设一个 User 可以拥有多个 Post,你可以这样定义它们之间的关系:

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80), nullable=False)
    content = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    user = db.relationship('User', backref='posts')

Post 表中,user_id 是外键,指向 User 表的 iddb.relationship() 用于在模型之间建立关系。

多对多关系

对于多对多关系,需要创建一个关联表:

tags = db.Table('tags',
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
    db.Column('post_id', db.Integer, db.ForeignKey('post.id'))
)

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    posts = db.relationship('Post', secondary=tags, backref='tags')

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80), nullable=False)
    content = db.Column(db.Text, nullable=False)

6. 总结

Flask-SQLAlchemy 提供了强大的 ORM 功能,使得数据库操作变得简单直观。你可以通过定义模型类与数据库表进行映射,轻松进行查询、插入、更新和删除操作。此外,通过使用 Flask-Migrate,你可以有效地管理数据库迁移,并处理随应用程序发展而变化的数据库结构。

最近发表
标签列表