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 進行數據庫遷移管理!