flask开发问题小记
前因
最近在使用flask开发一个APP的后端时出现了一些小问题。我使用sqlalchemy建立了如下多对多关系:
中间表
user_manager_group = db.Table('manage_group',
db.Column('user_id', db.Integer,
db.ForeignKey('users.id')),
db.Column('group_id', db.Integer,
db.ForeignKey('groups.id'))
)
小组
class Group(db.Model):
__tablename__ = 'groups'
id = db.Column(db.Integer, primary_key=True)
managers = db.relationship(
'User',
secondary=user_manager_group,
backref=db.backref('manage_groups', lazy='joined'),
lazy='dynamic')
用户
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
App中用户与群组形成了一个多对多关系,一个用户可能是多个组的管理员,一个组也可能有多个管理员,在Android向我的接口发送删除时,出现了一个Bug
sqlalchemy.orm.exc.StaleDataError: DELETE statement on table 'manage_group' expected to delete 1 row(s); Only 2 were matched.
无法删除某个小组
排查
在查找了许多资料后,终于发现了bug所在
manage_group是user和group的中间表,
CREATE TABLE user_manager (
user_id INTEGER,
grouo_id INTEGER,
FOREIGN KEY(user_id) REFERENCES users (id),
FOREIGN KEY(group_id) REFERENCES groups (id)
);
在Android端向我发送数据设定某个管理员时,我没有对数据进行验证,导致重复添加某一用户为某组的管理员。
当(user_id,task_id)这个二元组重复时,sqlalchemy是无法删除group。
修复
首先我给后端加上了判断,一旦用户已经是某组的管理员,则不添加,但是这还不够,
(user_id,group_id)这个二元组应当是唯一的,因此我们应当给它添加unique约束
代码如下
user_manager_group = db.Table('manage_group',
db.Column('user_id', db.Integer,
db.ForeignKey('users.id')),
db.Column('group_id', db.Integer,
db.ForeignKey('groups.id')), :
db.UniqueConstraint("user_id","group_id",name="managegroup")
)
但是使用flask-migrate迁移时出现了问题
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: _alembic_tmp_use
r_task.user_id, _alembic_tmp_user_task.task_id [SQL: 'INSERT INTO _alembic_tmp_user_task (user_id,
task_id) SELECT user_task.user_id, user_task.task_id \nFROM user_task']
此时我们需要打开migrate下的env文件往其中添加如下配置
render_as_batch=True,
添加后应为
context.configure(connection=connection,
render_as_batch=True,
target_metadata=target_metadata,
process_revision_directives=process_revision_directives,
**current_app.extensions['migrate'].configure_args)
此时执行flask db migrate即可
flask开发问题小记的更多相关文章
- Windows使用virtualenv搭建flask开发环境
virtualenv: VirtualEnv用于在一台机器上创建多个独立的Python虚拟运行环境,多个Python环境相互独立,互不影响,它能够: 在没有权限的情况下安装新套件 不同应用可以使用不同 ...
- flask开发restful api系列(8)-再谈项目结构
上一章,我们讲到,怎么用蓝图建造一个好的项目,今天我们继续深入.上一章中,我们所有的接口都写在view.py中,如果几十个,还稍微好管理一点,假如上百个,上千个,怎么找?所有接口堆在一起就显得杂乱无章 ...
- flask开发restful api
flask开发restful api 如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restfu ...
- 使用flask开发网站后端
Flask 是一个用于 Python 的微型网络开发框架,可以用于快速的搭建一个小型的网站. 我的搜索引擎:http://www.abelkhan.com 就是基于flask开发 一个flask的He ...
- Flask开发遇到的问题:BuildError: Could not build url for endpoint 'main.followers' with values ['username']. Did you mean 'main.user' instead?
@(Flask Web Development 12th chapter) 描述 Flask开发中遇到BuildError: Could not build url for endpoint 'mai ...
- 在 Django/Flask 开发服务器上使用 HTTPS
使用 Django 或 Flask 这种框架开发 web app 的时候一般都会用内建服务器开发和调试程序,等程序完成后再移交到生产环境部署.问题是这些内建服务器通常都不支持 HTTPS,我们想在开发 ...
- 用flask开发个人博客(4)—— flask中4种全局变量
https://blog.csdn.net/hyman_c/article/details/53512109 一 current_app current_app代表当前的flask程序实例,使用时需 ...
- Flask开发系列之初体验
Flask开发初探 介绍 在日常开发中,如果需要开发一个小型应用或者Web接口,一般我是极力推崇Flask的,主要是因为其简洁.扩展性高. 从这篇文章开始,我会写一个关于Flask的系列文章,通过多个 ...
- 【selenium+python】之Python Flask 开发环境搭建(Windows)
一.先安装python以及pip 二.其次, Python的虚拟环境安装: 在github上下载https://github.com/pypa/virtualenv/tree/master zip文 ...
随机推荐
- 罗技K380使用手册
Ipad最佳伴侣|码字神器|罗技K380|附使用指南 ———— 为了方便平时在家处理工作➕写小红书笔记,年初买了个Ipad2018 我以前买过一个罗技的K480,因为太重了不方便携带,于是又入了K38 ...
- 记一个日志冲突——管中窥豹[java混乱的日志体系]
D:\Java\jdk1.8.0_211\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Communit ...
- html/css 图片展示效果
demo.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- BZOJ3625 CF438E 小朋友与二叉树
心态崩了 不放传送门了 辣鸡bz 还是正经一点写一下题解= = 就是显然我们可以把权值写成生成函数形式g(0/1序列)来表示权值是否出现 然后f来表示总的方案数 可以列出 分别枚举左右子树和空树的情况 ...
- Hadoop搭建完全分布式
ubuntu系统下: https://blog.csdn.net/u014636511/article/details/80171002 centos系统下: https://blog.csdn.ne ...
- BestCoder Round #92 (hdu 6015 6016)
比赛链接 A题主要是map的使用,比赛的时候问了下队友,下次要记住了 #include<bits/stdc++.h> using namespace std; typedef long l ...
- Struts第一个程序。
1:创建完程序后.先写web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmln ...
- linux 基础知识及命令总结
1.mkdir 创建目录 -p 创建多级目录 mkdir -p /data/test -m, --mode=模式 设置权限模式(类似chmod),而不是rwxrwxrwx 减umask -p, ...
- react教程 — redux
一.概念: http://caibaojian.com/react/redux-basic.html 或 https://www.cnblogs.com/maopixin ...
- 如何设置Windows操作系统打印机与xlpd连接
Xlpd是Xmanager中负责远程打印的软件,除了打印远程文件,它还具备很多功能,本集将具体讲解Xlpd的主要功能. 主要功能如下: 1. 支持LPD协议(RFC1179) 在RFC1179中定义 ...