在这一篇中,我们将学习如何在 Flask 中集成数据库,并使用 ORM(对象关系映射)来进行数据库操作。数据库是许多 Web 应用的核心组成部分,通过使用 Flask-SQLAlchemy 这个强大的工具,我们可以轻松地与数据库进行交互。
Flask-SQLAlchemy 是 Flask 扩展的一部分,它简化了在 Flask 应用中使用 SQLAlchemy 进行数据库操作的过程。SQLAlchemy 是一个功能强大且灵活的 Python ORM 工具,它允许我们使用 Python 对象表示数据库中的表和记录。
安装 Flask-SQLAlchemy:
pip install Flask-SQLAlchemy
在 Flask-SQLAlchemy 中,模型是通过定义 Python 类来完成的。每个类都将成为数据库中的一张表。在 models.py
中,添加一个用户模型:
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()
db = SQLAlchemy()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), nullable=False)
age = db.Column(db.Integer, nullable=False, index=True)
email = db.Column(db.String(120), nullable=False)
def __repr__(self):
return f"User('{self.username}', '{self.age}', '{self.email}')"
user_index = db.Index('user_index', User.username, User.email, unique=True)
注意:
由于连接的是mysql数据库,需要依赖MySQLdb,正常来说是要按照mysqlclient,但是按照这个依赖会报错:ERROR:pip.subprocessor:Getting requirements to build wheel exited with 1
所以改为安装pymysql来代替,但是需要加入这两行代码:
import pymysql
pymysql.install_as_MySQLdb()
在 Flask 应用中,首先需要进行初始化。在 __init__.py
文件中,添加以下代码:
from flask import Flask
from .config import Config
from flask_migrate import Migrate
def create_app(config_class=Config):
app = Flask(__name__)
app.config.from_object(config_class)
# 注册蓝图、扩展等其他应用组件
from app.index import index_blueprint
from app.auth import auth_blueprint
app.register_blueprint(index_blueprint)
app.register_blueprint(auth_blueprint)
from .models import db
db.init_app(app)
migrate = Migrate(app, db)
return app
当 Flask-SQLAlchemy 中的模型发生新增或者更新时,可以通过 Flask-Migrate 进行数据库迁移。数据库迁移是一种将数据库模式更新到最新版本的过程,它允许在不丢失数据的情况下进行数据库模型的修改。
安装 Flask-Migrate
pip install Flask-Migrate
使用 Flask-Migrate
# 初始化迁移环境,这会在应用目录中创建一个名为 `migrations` 的文件夹,用于存储迁移脚本
flask db init
# 模型发生更改时,运行以下命令来创建一个新的迁移脚本
flask db migrate -m "Your migration message"
# 运行以下命令将迁移应用到数据库
flask db upgrade
from ..models import User, db
from sqlalchemy import or_, text
# 添加一条新用户记录
new_user = User(username='john_doe', email='[email protected]', age=18)
db.session.add(new_user)
db.session.commit()
# 查询所有用户
all_users = User.query.all()
for user in all_users:
print(user)
# 通过用户名查询单个用户
user = User.query.filter_by(username='john_doe').first()
print(user)
# or操作
users = User.query.filter(or_(User.username.like('J%'), User.email.like('%@example.com%'))).all()
for user in users:
print(user)
# like操作
users = User.query.filter(User.username.like('J%')).all()
for user in users:
print(user)
# 排序
users = User.query.order_by(User.username.desc()).all()
for user in users:
print(user)
# count、sum
count = db.session.query(User).count()
print(count)
ages = db.session.query(db.func.sum(User.age)).scalar()
print(ages)
# 更新用户的邮箱地址
user = User.query.filter_by(username='john_doe').first()
user.email = '[email protected]'
db.session.commit()
user = User.query.filter_by(username='john_doe').first()
print(user)
# 删除用户
user = User.query.filter_by(username='john_doe').first()
db.session.delete(user)
db.session.commit()
# 直接执行sql
result = db.session.execute(text('select * from user'))
print(len(result.fetchall()))
本文介绍了如何在 Flask 中集成数据库,并使用 Flask-SQLAlchemy 进行简单的 ORM 操作。在实际项目中,可以通过定义更多的模型和进行复杂的查询操作来满足需求。数据库是 Web 开发中不可或缺的一部分,Flask 和 SQLAlchemy 让我们能够以更 Pythonic 的方式进行数据库操作,提高了开发效率。