flask-sqlalchemy是flask框架在sqlalchemy基礎上改造的一個orm框架
現在有兩個實體Article文章和Category分類
一個分類下可能有多篇文章
相關示例:
項目相關結構截圖

定義基類BaseModel
from sqlalchemy import Column,String,Integer,Text,DateTime,ForeignKey from flask_sqlalchemy import SQLAlchemy from datetime import datetime db=SQLAlchemy() class BaseModel(db.Model): __abstract__=True ##加了該屬性后生成表的時候不會生成該表 id=Column(Integer,primary_key=True,autoincrement=True) addtime=Column(DateTime) status=Column(Integer,default=1) ##初始化構造函數 def __init__(self): self.addtime=datetime.now()
子類Article繼承BaseModel
from app.models.base import BaseModel,db from datetime import datetime from sqlalchemy import Column,String,Integer,Text,DateTime,ForeignKey from sqlalchemy.orm import relationship ##文章類 class Article(BaseModel): __tablename__ ='article' ##數據庫對應的表名 desction=Column(String(256)) title=Column(String(64),nullable=True) author=Column(String(64),default='未知作者') cover_img=Column(String(128)) source_link_url=Column(String(128)) content=Column(Text) view_count=Column(Integer,default=0) ##relationship用戶指定實體模型對應關系,這里的Category指的是實體里編寫的類名,區分大小寫 category1=relationship('Category') ##category.id里的category指的是上句category接收的變量名,id列名 ##ForeignKey表示外鍵 categroy_id=Column(Integer,ForeignKey('category1.id')) def __init__(self): self.addtime=datetime.now() ##添加數據 def add(self,article): try: db.session.add(article) db.session.commit() except Exception as e: db.session.rollback() print(e) raise e pass
子類category繼承BaseModel
from app.models.base import BaseModel,db from datetime import datetime from sqlalchemy import Column,String,Integer,Text,DateTime,ForeignKey ##分類 class Category(BaseModel): __tablename__ ='category' ##指定生成時數據庫里的表名 name=Column(String(64),unique=True,nullable=False) def __init__(self): super(Category,self).__init__()
初始化調用生成表結構
from flask import Flask from app.models.base import db # from app.spider import cn_blogs ##實例化全局app對象 def create_app(): app = Flask(__name__) ##核心代碼 app.config.from_object('app.config.setting') db.init_app(app) ##入站操作 with app.app_context(): # pass ##創建表結構 db.create_all() # cn_blogs.get_article_list('https://news.cnblogs.com/') return app
數據遷移
,因為采用'db.create_all'在后期修改數據庫表字段的時候,不會自動的映射到數據庫中,必須刪除表,
然后重新運行'db.create_all' 才會重新映射。這樣不符合我們的要求,因此flask-migrate就是為了解決
這個問題。它可以在每次修改模型(class)后,可以將修改的字段映射到數據庫中
flask數據遷移主要依賴兩個模塊lask-migrate和flask-script
flask-migrate用到的常用命令:
init: 初始化
migrate:生成遷移文件
upgrade:提交數據庫更改操作
downgrade :回滾到上一步操作
在pipenv中自行安裝f lask-migrate和flask-script
現數據庫中article表相關信息

在上表article中,如果想添加一個排序字段sort_id
sort_id=Column(Integer,default=99)
在根目錄run.py如下代碼
from flask_migrate import Migrate,MigrateCommand from flask_script import Manager,Shell from app import create_app,db from app.models.messaage import Message app=create_app() ##數據遷移關鍵代碼 manage = Manager(app) # 第一個參數是Flask的實例,第二個參數是Sqlalchemy數據庫實例 migrate = Migrate(app, db) # manager是Flask-Script的實例,這條語句在flask-Script中添加一個db命令 manage.add_command('db', MigrateCommand) if __name__ == '__main__': ##調用遷移的入口方法 manage.run() #app.run(port=3000, debug=True,threaded=True)
右鍵run.py文件運行

點擊底部terminal執行命令行 :python run.py db init
run.py為Manage所在的文件名
執行命令后會在項目根目錄下生成一個名為migrations的文件目錄,如果該目錄存在的話則不會再次生成
運行

執行python run.py db migrate

這里會自動生成模型修改的字段信息,並記錄在migrations文件夾里

執行 python run.py db upgrade
將會將執行 里面的upgrade函數,更新到數據庫里,這里執行命令的時候建議先去檢查下更新的字段是否無誤后再執行操作

這時候再來看數據庫

sort_id字段已經成功更新到數據庫article表里了
同理,如果更新錯了,想回到上一步沒更新之前的狀態,執行downgrade命令,實現回滾操作
downgrade執行的是migrations文件夾里downgrade函數,具體可以查看該函數內部實現
執行 python run.py db downgrade 命令

這時候再來看數據庫article表結構

這里還有個小問題:發現如果是創建新表的時候只能調用db.create_all()來創建,flask-migrate目前好像不支持
