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

flask-sqlalchemy使用及数据迁移的更多相关文章

  1. Flask入门之触发器,事件,数据迁移

    SQLAlchemy Core和SQLAlchemy ORM都具有各种各样的事件挂钩: 核心事件 - 这些在 Core Events中描述,并包括特定于连接池生命周期,SQL语句执行,事务生命周期以及 ...

  2. Flask (三) 数据迁移

    数据迁移 安装 pip install flask-migrate 初始化 使用app和db进行migrate对象初始化   from flask_migrate import Migrate mig ...

  3. Flask_Flask-Migrate数据迁移扩展(十二)

    在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据.更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中. ...

  4. flask SQLAlchemy中一对多的关系实现

    SQLAlchemy是Python中比较优秀的orm框架,在SQLAlchemy中定义了多种数据库表的对应关系, 其中一对多是一种比较常见的关系.利用flask sqlalchemy实现一对多的关系如 ...

  5. flask SQLALchemy外键及约束

    from flask import Flask,session from flask_sqlalchemy import SQLAlchemy import config app = Flask(__ ...

  6. flask, SQLAlchemy, sqlite3 实现 RESTful API 的 todo list, 同时支持form操作

    flask, SQLAlchemy, sqlite3 实现 RESTful API, 同时支持form操作. 前端与后台的交互都采用json数据格式,原生javascript实现的ajax.其技术要点 ...

  7. postgresql 不同数据库不同模式下的数据迁移

    编写不容易,转载请注明出处谢谢, 数据迁移 因为之前爬虫的时候,一部分数据并没有上传到服务器,在本地.本来用的就是postgresql,也没用多久,数据迁移的时候,也遇到了很多问题,第一次使pg_du ...

  8. 【SQLServer】记一次数据迁移-标识重复的简单处理

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 今天在数据迁移的时候因为手贱遇到一个坑爹问题,发来大家乐乐,也传授新手点经验 迁移惯用就 ...

  9. flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方法

    flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...

随机推荐

  1. realsense SDK编译 debug

    1>------ 已启动全部重新生成: 项目: ZERO_CHECK, 配置: Debug x64 ------1> Checking Build System1> CMake do ...

  2. ES6深入浅出-8 新版的类(下集)-1.简单语法

    回顾 当你声明一个空的对象obj的时候,会生成一块内存这个内存里面什么都没有,自由__proto__存在401的地址. 也就是Object的protototype在内存中的地址 类 通过函数创建类.这 ...

  3. 宣化上人:大佛顶首楞严经四种清净明诲浅释(1)(转自学佛网:http://www.xuefo.net/nr/article23/230609.html)

    唐天竺·沙门般剌密帝译 宣化上人主讲 一九八三年四月十七日晚讲于万佛圣城 四种清净明诲,真实不虚 楞严经里的四种清净明诲:断淫.断杀.断偷.断妄,是息息相关的.若犯淫戒,就容易犯杀戒,也容易犯盗戒.妄 ...

  4. 修改ecshop的70种技巧

    1.如何修改网站”欢迎惠临本店”答复(dafu):languages\zh_cn\common.php文件中,$_LANG['welcome']=’欢迎惠临本店’:将他修改成你需要的字样. 2.如何修 ...

  5. jqweui 正在加载样式的用法

    见下图: 代码说明: $.showLoading("加载中..."); $.ajax({ success : function(data) { $.hideLoading(); } ...

  6. Eclipse导war包忽略node_modules等文件

    window7环境下,选择project->Properties->如下图

  7. 虚拟机中Linux环境下使用Squid部署代理缓存服务(及透明传输)

    小知识: 正确的使用Squid服务程序部署代理缓存服务可以有效提升访问静态资源的效率,降低原服务器的负载. 不仅如此,还为读者们添加了对指定IP地址.网页关键词.网址与文件后缀的ACL访问限制功能的实 ...

  8. 036 Android Xutils3网络请求框架使用

    1.xUtils3 介绍 xUtils 中目前包括了主要的四大模块,分别为 DbUtils 模块.ViewUtils 模块.HttpUtils 模块以及 BitmapUtils 模块. xUtils3 ...

  9. [转帖]Redis未授权访问漏洞复现

    Redis未授权访问漏洞复现 https://www.cnblogs.com/yuzly/p/11663822.html config set dirconfig set dbfile xxxx 一. ...

  10. tp5功能模块添加与调试

    在原先完善的功能基础上添加比如导出列表为excel ,一下子把所有属性写全了,出了问题,不好查找问题在哪? 所以遇到这种问题,需要最简单的测试.比如新建一个mysql表内就放一列一行数据.减少代码量, ...