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的名字,否 ...
随机推荐
- SQL中的逻辑运算符
逻辑运算符和比较运算符一样,都是返回 true 或 false 值得布尔数据类型. 运算符 行为 ALL 如果一个比较集中全部都是 true ,则值为 true AND 如果两个布尔值表达式均为 ...
- HDU4497——GCD and LCM
这个题目挺不错的,看到是通化邀请赛的题目,是一个很综合的数论题目. 是这样的,给你三个数的GCD和LCM,现在要你求出这三个数有多少种可能的情况. 对于是否存在这个问题,直接看 LCM%GCD是否为0 ...
- 【loj2319】[NOIP2017]列队 Splay(卡过)
题目描述 给出一个 $n\times m$ 的矩阵,第 $i$ 行第 $j$ 列的数为 $(i-1)\times m+j$ . 现在有 $q$ 次操作,每次操作给出位置 $(x,y)$ ,取出 $(x ...
- P2774 方格取数问题
题目背景 none! 题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于 ...
- CSS3制作3D水晶糖果按钮
本人仿照20个漂亮 CSS3 按钮效果及优秀的制作教程中的BonBon(Candy)Button实现了其棒棒糖果按钮,如下图所示: 在线演示地址见here. 使用完全使用CSS实现,无需JS.源码如下 ...
- mysql四-2:多表查询
一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备表 #建表 create table department( id int, name varchar(20) ); create ta ...
- linux 进程信号集合 sigset_t
sigset_t 号集及信号集操作函数:信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来 ...
- Linux之进程通信20160720
好久没更新了,今天主要说一下Linux的进程通信,后续Linux方面的更新应该会变缓,因为最近在看Java和安卓方面的知识,后续会根据学习成果不断分享更新Java和安卓的方面的知识~ Linux进程通 ...
- Problem D. Country Meow 2018ICPC南京
n个点求出最小圆覆盖所有点 退火算法不会,不过这题可以用三分套三分写 x轴y轴z轴各三分 #include <cstdio> #include <cstring> #inclu ...
- python中如何优雅续行和换行
http://note.youdao.com/noteshare?id=8dbcb93991a89a6cfcd95580ed2198f0