前因

最近在使用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即可

转载于:https://www.cnblogs.com/lynsyklate/p/7861203.html

flask开发问题小记相关推荐

  1. Flask开发系列之Web表单

    Flask开发系列之Web表单 简单示例 from flask import Flask, request, render_templateapp = Flask(__name__) @app.rou ...

  2. flask 开发接口测试平台

    flask 开发接口测试平台 数据库,forms  views  视图, 数据库如下: # encoding: utf-8 ''' @author: lileilei @file: models.py ...

  3. 基于Flask开发企业级REST API应用(一)

    关于我 编程界的一名小小程序猿,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:github.com/hy ...

  4. Flask开发成语接龙游戏,闲来无事手机玩玩自己写的游戏吧!

    英语单词学习应用 周五发布的文章Flask开发天气查询软件,带你掌握pipenv的使用与手机Termux下的部署发布后,看到喜欢的人比较多.本来周末打算照着扇贝/极光单词,写一个英语单词自测工具.但苦 ...

  5. flask接口mysql开发例子,使用Flask开发简单接口3–引入MySQL

    在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 在前两篇文章中,我们学习了通过Flask开发GET和POST请求接口,但是尚未实现操作数据库,因此,今天的目的是学习 ...

  6. python flask api部署_使用flask开发api——部署flask,使用gunicorn+gevent模式的http server...

    使用flask开发api--部署flask,使用gunicorn+gevent模式的http server 用flask开发了服务端的api,记录部署上服务器的过程,以供后续使用. 安装python3 ...

  7. Flask开发服务器

    Flask开发服务器 WSGI服务器: Gunicorn Gevent :基于协程 Tornado uWSGI CherryPy Flask天然的在底层支持Gevent,性能极佳. Web服务器:Ng ...

  8. 云音乐小程序开发知识小记(上)

    云音乐小程序开发知识小记(上) 在云音乐小程序开发中学到的 分上中下,因为本人也是在学习中,请多指教 本次的**云音乐小程序开发知识小记(上)**主要涉及四个方面: 轮播图 数字格式化处理 自定义组件 ...

  9. flask开发桌面应用程序_使用Microsoft Authenticatio将多个破折号应用程序嵌入Flask中...

    flask开发桌面应用程序 Full disclosure: I am not an expert in developing web applications. I don't even consi ...

最新文章

  1. 头条Android面试题,史上最全的Android面试题集锦(五)
  2. 判断一个python字符串中是否包含中文字符
  3. html5图像映射坐标怎么看,如何将AxesImage中的坐标映射到已保存图像文件中的坐标?...
  4. ios开发text kit_IOS开发入门之TextKit详解
  5. SpringClound介绍
  6. HttpClientHelper的封装
  7. 原生js实现分页效果(带实例)
  8. 阿里云张献涛:如何修炼云计算的弹指神通
  9. 读书笔记 - 多Agent强化学习下的自适应交通信号控制研究综述2017
  10. 高斯过程回归python_高斯过程回归在pythony中的实现(n个样本,n个目标)
  11. python爬虫 笔趣阁
  12. Java用Freemarker 生成word文档
  13. adb 连接某个wifi_使用adb命令连接WiFi进行无线调试
  14. 新年,未知的开始---Created by 思贤泪自潸
  15. 100行Python代码,做一个打地鼠小游戏!
  16. sparksql-分组月度环比同比自动化
  17. C++编译器优化:Copy Elision
  18. 【Delphi】Android 桌面图标添加快捷菜单功能
  19. 【CF 70D】Professor's task
  20. 基于vue-cli3开发微信公众号网页——调取微信分享,微信支付接口

热门文章

  1. 30个数据可视化超级工具_Python5个数据可视化工具
  2. MAC上安装iTerm2+oh my zsh+设置Dracula主题
  3. android 原理 组合控件_Android_组合方式自定义控件
  4. a表两个字段都与b表一个字段关联_数据库表的主键实例分析
  5. 安装 | OpenCV4.2.0 + VS2017安装教程
  6. java填空题 在非静态成员方法中_Java程序设计填空和改错题(参考答案)
  7. VC++/MFC中调用CHM帮助文档的方法--ShellExecute
  8. windows如何访问linux系统文件,如何从 Windows 访问 Linux 文件?——方法步骤
  9. mysql my-small.ini_MySql优化之my-small.ini配置
  10. ui vue 创建项目教程 并关闭语法_使用vue ui命令创建vue项目步骤