flask-sqlalchemy使用及數據遷移


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目前好像不支持


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM