flask插件系列之SQLAlchemy实用技巧
下面记录一下SQLAlchemy使用的技巧。
在多模块下定义models
- 如果由多个蓝图下读定义了model模块,在初始化的时候需要加载到上下文中。
当使用flask_Migrate迁移数据库的时候,当执行:
python manage.py db migrate -m '修改说明'
db会默认去上下文中寻找定义的models模型,所以必须在初始化app的时候加载相关models的上下文;因此所有相关的model.py文件都应该在初始化app的时候:
from XXX import model
数据迁移的坑
- SQLAlchemy当model发生了修改的时候,其是不能识别字段的的类型和字段大小的。
from extensions import db
class User(db.model)
__tablename__ = 'users'
user_id = db.Column(db.String(8), primary_key=True)
# 改为
class User(db.model)
__tablename__ = 'users'
user_id = db.Column(db.String(20), primary_key=True)
问题:直接迁移会出现no change,因为不会检测字段的类型。
办法:修改字段的名字迁移后再将字段改回迁移,相当于删除原来的字段重新创建;
- 当当前的versions和数据库的版本不一致导致无法迁移时。
办法:
# 删除原来的migrations文件夹;
# 去数据库删除alembic_version表的内容;
# 重新执行数据库迁移操作;
手动初始化SQLAlchemy
在有些时候,我们没有初始化APP,但是又想使用models中定义的模型和数据库的ORM操作,那么就需要手动初始化了。
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from models import AdminUser
# 创建一个配置对象
engine = create_engine('mysql+pymysql://username:passwd@ip:port/db?charset=utf8', convert_unicode=True)
# 创建一个会话
db_session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
# 初始化查询对象
AdminUser.query = db_session.query_property()
# 下面就跟在框架中一样了
admin = AdminUser()
admin.id = 1
admin.username = username
admin.password = pwd
db_session.add(admin)
db_session.commit()
查询报错:sqlalchemy.exc.InvalidRequestError: Can't reconnect until invalid transaction is rolled back
原因是:连接断开后,事务没有回滚,残留的锁导致后续的查询报错.sqlalchemy对每一个查询和插入等操作都是一个事务。
解决:在所有的数据库操作的时候捕捉异常进行事务的回滚。
# main.py
from models import OrderInfo
from sqlalchemy.exc import InvalidRequestError
try:
order = OrderInfo.query.filter_by(task_id=user_dict.get('task_id')).first()
order.status = 'COMPLETE'
db.session.commit()
except InvalidRequestError:
db.session.rollback()
except Exception as e:
print(e)
flask插件系列之SQLAlchemy实用技巧的更多相关文章
- flask插件系列之SQLAlchemy基础使用
sqlalchemy是一个操作关系型数据库的ORM工具.下面研究一下单独使用和其在flask框架中的使用方法. 直接使用sqlalchemy操作数据库 安装sqlalchemy pip install ...
- flask插件系列之flask_session会话机制
flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制. 配置参数详解 SESSION_COOKIE_NAME 设置返回给客户端的c ...
- flask插件系列之flask_uploads上传文件
前言 flask可以实现上传文件和下载文件的基本功能,但如果想要健壮的功能,使用flask_uploads插件是十分方便的. 安装 pip install flask_uploads 基本使用 # e ...
- flask插件系列之flask_caching缓存
前言 为了尽量减少缓存穿透,同时减少web的响应时间,我们可以针对那些需要一定时间才能获取结果的函数和那些不需要频繁更新的视图函数提供缓存服务,可以在一定的时间内直接返回结果而不是每次都需要计算或者从 ...
- flask插件系列之Flask-WTF表单
flask_wtf是flask框架的表单验证模块,可以很方便生成表单,也可以当做json数据交互的验证工具,支持热插拔. 安装 pip install Flask-WTF Flask-WTF其实是对w ...
- flask插件系列之flask_restful设计API
前言 flask框架默认的路由和视图函数映射规则是通过在视图函数上直接添加路由装饰器来实现的,这使得路由和视图函数的对应关系变得清晰,但对于统一的API开发就变得不怎么美妙了,尤其是当路由接口足够多的 ...
- flask插件系列之flask_celery异步任务神器
现在继续学习在集成的框架中如何使用celery. 在Flask中使用celery 在Flask中集成celery需要做到两点: 创建celery的实例对象的名字必须是flask应用程序app的名字,否 ...
- flask插件系列之flask_cors跨域请求
前后端分离在开发调试阶段本地的flask测试服务器需要允许跨域访问,简单解决办法有二: 使用flask_cors包 安装 pip install flask_cors 初始化的时候加载配置,这样就可以 ...
- Flask插件系列之flask_celery
现在继续学习在集成的框架中如何使用celery. 在Flask中使用celery 在Flask中集成celery需要做到两点: 创建celery的实例对象的名字必须是flask应用程序app的名字,否 ...
随机推荐
- 第157天:canvas基础知识详解
目录 一.canvas简介 1.1 什么是canvas?(了解) 1.2 canvas主要应用的领域(了解) 二.canvas绘图基础 2.0 sublime配置canvas插件(推荐) 2.1 Ca ...
- 最大流算法-ISAP
引入 最大流算法分为两类,一种是增广路算法,一种是预留推进算法.增广路算法包括时间复杂度\(O(nm^2)\)的EK算法,上界为\(O(n^2m)\)的Dinic算法,以及一些其他的算法.EK算法直接 ...
- BZOJ4975 区间翻转
这个范围给的很像区间dp之类的,想了半天没一点思路,滚去看了一眼status被吓傻了.然后瞎猜了一发结论就过掉了. 求出逆序对数,判断是否为奇数即可.因为翻转区间会把将这段区间的逆序对取反,而长度为4 ...
- P1053 篝火晚会
题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有nnn个同学,编号从111到nnn.一开始 ...
- 吉哥系列故事――完美队形II HDU - 4513(马拉车变一下形)
题意: 求最长回文串...但这个回文串要符合从中间到两头 逐个递减 解析: 在扩散的时候加一个判断就好了 #include <iostream> #include <cstdio&g ...
- struts2(s2-052)远程命令执行漏洞复现
漏洞描述: 2017年9月5日,Apache Struts发布最新安全公告,Apache Struts2的REST插件存在远程代码执行的高危漏洞,该漏洞由lgtm.com的安全研究员汇报,漏洞编号为C ...
- 【bzoj2006】【NOI2015】超级钢琴
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4292 Solved: 2195[Submit][Statu ...
- [HEOI2014]逻辑翻译
ywy_c_asm的良心题解 是道好题 体现了二进制位的形象递归思想,以及将FWT的思路(都是拆位分治)用到题目中的典范 可以暴力高斯消元.完全没有利用2^N以及+-1的良好性质 发现项数,方程和二进 ...
- Spring MVC同时接收一个对象与List集合对象
原:https://blog.csdn.net/u011781521/article/details/77586688/ Spring MVC同时接收一个对象与List集合对象 2017年08月25日 ...
- 循环神经网络 RNN
随着科学技术的发展以及硬件计算能力的大幅提升,人工智能已经从几十年的幕后工作一下子跃入人们眼帘.人工智能的背后源自于大数据.高性能的硬件与优秀的算法的支持.2016年,深度学习已成为Google搜索的 ...