ORM模型
在Flask中,ORM(Object-Relational Mapping,对象关系映射)模型是指使用面向对象的方式来操作数据库的编程技术。它允许开发者使用Python类和对象来操作数据库,而不需要直接编写SQL语句。
核心概念
1. ORM模型定义
在Flask中,ORM模型通常是通过SQLAlchemy(最流行的Python ORM工具)或类似的库来定义的。一个ORM模型对应数据库中的一个表。
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()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}>'
2. 主要特点
-
表映射为类:每个数据库表对应一个Python类
-
列映射为属性:表中的列对应类的属性
-
行映射为对象:表中的每一行数据对应类的一个实例
常用字段类型
ORM类型 | Python类型 | 数据库类型 |
---|---|---|
db.Integer | int | INTEGER |
db.String(size) | str | VARCHAR(size) |
db.Text | str | TEXT |
db.Float | float | FLOAT |
db.Boolean | bool | BOOLEAN |
db.DateTime | datetime.datetime | DATETIME |
db.Date | datetime.date | DATE |
db.Time | datetime.time | TIME |
db.LargeBinary | bytes | BLOB |
模型关系
1. 一对多关系
class User(db.Model):id = db.Column(db.Integer, primary_key=True)posts = db.relationship('Post', backref='author', lazy=True)class Post(db.Model):id = db.Column(db.Integer, primary_key=True)user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
2. 多对多关系
tags = db.Table('tags',db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True),db.Column('post_id', db.Integer, db.ForeignKey('post.id'), primary_key=True)
)class Post(db.Model):id = db.Column(db.Integer, primary_key=True)tags = db.relationship('Tag', secondary=tags, lazy='subquery',backref=db.backref('posts', lazy=True))class Tag(db.Model):id = db.Column(db.Integer, primary_key=True)
基本CRUD操作
1. 创建(Create)
new_user = User(username='john', email='john@example.com')
db.session.add(new_user)
db.session.commit()
2. 读取(Read)
# 获取所有用户
users = User.query.all()# 获取单个用户
user = User.query.get(1)# 条件查询
user = User.query.filter_by(username='john').first()
3. 更新(Update)
user = User.query.get(1)
user.email = 'new@example.com'
db.session.commit()
4. 删除(Delete)
user = User.query.get(1)
db.session.delete(user)
db.session.commit()
在Flask中使用ORM模型
-
首先需要配置数据库URI:
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
-
创建数据库表:
with app.app_context():db.create_all()
优势
-
提高开发效率:不用写原生SQL语句
-
代码更易维护:数据库操作以面向对象方式进行
-
数据库无关性:可以轻松切换不同类型的数据库
-
安全性:自动处理SQL注入等安全问题
注意事项
-
记得在修改模型后执行数据库迁移(如使用Alembic)
-
批量操作时注意性能(N+1查询问题)
-
复杂的查询可能还是需要直接使用SQL
Flask中的ORM模型大大简化了数据库操作,使得开发者可以更专注于业务逻辑的实现。
创建外键
查询外键
Flask连接MySQL数据库+ORM增删改查
在Flask中,很少会使用pymysql直接写原生SQL语句去操作数据库,更多的是通过SQLAichemy提供的ORM技术,类似于操作普通Python对象一样实现数据库的增删改查操作,而Flask-SQLAlchemy是需要单独安装的,因为Flask-SQLAlchemy依赖SQLAlchemy,所以只要安装了Flask-SQLAlchemy,SQLAlchemy会自动安装。
pip install flask-sqlalchemy
# 登录数据库
mysql -u root -p
# 创建数据库(支持中文)
CREATE DATABASE database_learn DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import textapp=Flask(__name__)# 设置连接数据库的信息
HOSTNAME='127.0.0.1'
PORT=3306
USERNAME='root'
PASSWORD='123456'
DATABASE='database_learn'# 设置连接数据库的URL
app.config['SQLALCHEMY_DATABASE_URI']=f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4'# 在app.config中设置好连接数据库的信息,然后使用SQLLichemy(app)创建一个db对象
# SQLAlchemy会自动读取app.config中连接数据库的信息db=SQLAlchemy(app)with app.app_context():with db.engine.connect() as conn:result=conn.execute(text("select 1"))print(result.fetchone())@app.route('/')
def hello_world():return 'Hello World!'if __name__ == '__main__':app.run(debug=True)
一个ORM模型与一个数据库中的一张表对应
创建数据库表
其实就是创建一个ORM模型,而且user表有属性是username和password

添加用户
查询用户
我刷新了两次add页面,所以有两个添加张三
更新用户
删除
Flask-migrate使用方法指南
# flask-migrate迁移ORM模型
在终端中
pip install flask-migrate
flask db init
flask db migrate
flask db upgrade
自动生成。第一次创建的时候需要Init,后面再更新的话只需要后两条命令
这样就不需要再重新创建表设计表,能够直接更新表的属性
Alembic 使用方法指南
Alembic 是一个轻量级的数据库迁移工具,专门为 SQLAlchemy 设计。以下是 Alembic 的基本使用方法:
1. 安装
pip install alembic
2. 初始化
在项目目录中初始化 Alembic:
alembic init alembic
这会创建一个 alembic
目录和 alembic.ini
配置文件。
3. 配置
编辑 alembic.ini
文件,设置数据库连接:
sqlalchemy.url = driver://user:pass@localhost/dbname
或者在 alembic/env.py
中动态配置:
config.set_main_option('sqlalchemy.url', 'your-database-url')
4. 创建迁移脚本
自动生成迁移脚本(基于模型变更):
alembic revision --autogenerate -m "描述信息"
手动创建空迁移脚本:
alembic revision -m "描述信息"
5. 编辑迁移脚本
生成的迁移脚本位于 alembic/versions/
目录下,包含 upgrade()
和 downgrade()
函数。
6. 执行迁移
升级到最新版本:
alembic upgrade head
升级到特定版本:
alembic upgrade <版本号>
降级到特定版本:
alembic downgrade <版本号>
7. 其他常用命令
-
查看当前版本:
alembic current
-
查看历史记录:
alembic history
-
生成 SQL 而不执行(用于检查):
alembic upgrade head --sql
8. 与 Flask 集成
如果使用 Flask-SQLAlchemy,可以在 env.py
中:
from myapp import db
target_metadata = db.metadata
9. 最佳实践
-
每次模型变更后生成新的迁移脚本
-
为每个迁移编写清晰的描述信息
-
在团队中共享迁移脚本
-
在生产环境部署前测试迁移
注意事项
-
确保模型与数据库同步
-
自动生成迁移后检查生成的脚本是否正确
-
对于复杂变更,可能需要手动编辑迁移脚本
希望这个指南能帮助你开始使用 Alembic 进行数据库迁移管理!