网站首页 > 技术文章 正文
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 数据库(可以自动创建)
代码示例
- 定义 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.Model:User 类继承自 db.Model,它是一个 SQLAlchemy ORM 模型。每个模型类对应数据库中的一张表。
- db.Column:定义表中的字段,类型包括 Integer、String、DateTime 等。
- 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
- 在 app.py 中配置 Flask-Migrate
from flask_migrate import Migrate
# 初始化 Flask-Migrate
migrate = Migrate(app, db)
- 使用迁移命令
首先,初始化迁移仓库:
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 表的 id。db.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,你可以有效地管理数据库迁移,并处理随应用程序发展而变化的数据库结构。
- 上一篇: 一个超方便使用SQL的Python神器
- 下一篇: Python SQL数据库操作
猜你喜欢
- 2024-12-13 Flask-PyMongo 小试牛刀
- 2024-12-13 盘点2024年最有“钱途”的8个节点及布局指南
- 2024-12-13 Python+Socket实现多人聊天室:聊天、群聊、图片、表情、文件等
- 2024-12-13 AI Agent 和 LangGraph 给项目管理方式带来新的变革
- 2024-12-13 信息安全聚合 Sec-News 的重构之路
- 2024-12-13 (进阶篇)简析一个比Flask和Tornado更高性能的API 框架FastAPI
- 2024-12-13 Flask_admin—快速搭建访客登记系统Web管理后台
- 2024-12-13 Flask开发RESTful API
- 2024-12-13 mysql 数据库使用分享(多图解析)
- 2024-12-13 ubuntu 安装 apache-airflow 教程
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)