flask 多对多,如何只删除中间表数据,不去动两边表数据

2020-04-28 16:56:18 +08:00
 334862132
一个中间表
roles_rights = db.Table('roles_rights',
right_id = db.Column('right_id',db.Integer,db.ForeignKey('rights.id')),
role_id = db.Column('role_id',db.Integer,db.ForeignKey('roles.id')))
2469 次点击
所在节点    Python
12 条回复
334862132
2020-04-28 16:58:42 +08:00
我现在只想删除 roles_rights 表的数据,但是现在想删除的话必须要把 role 对应的数据删掉,求问,模型如何能在不动其他外键表的情况下只删除 roles_rights 表的数据
XGF
2020-04-28 17:17:18 +08:00
去掉 db.ForeignKey
334862132
2020-04-28 17:19:59 +08:00
@XGF 把 db.ForeignKey 去掉了,添加时候不就出问题了....
模型好麻烦,还是 sql 原生写起来舒服....
more1sec
2020-04-28 18:43:39 +08:00
我以前的公司,全部表都没用外键,靠业务代码维护数据一致性
encro
2020-04-28 19:38:25 +08:00
db.ForeignKey 有参数,可以设置不嵌套删除,
然后 db.Column 有参数可以设置允许为 null,

你删除 roles_rights 时,如果删除了 role 和 right,只能说明你表关联设置错了。

哎呀,怎么是 flask 不是 django?
应该也差不多。
hmxxmh
2020-04-28 19:44:30 +08:00
@more1sec 我也喜欢通过业务逻辑关联,比外键好用吧
saulshao
2020-04-28 20:13:35 +08:00
Django 允许在定义模型的时候,显式指定不要使用数据库中的外键
Philippa
2020-04-29 02:05:11 +08:00
这个和 flask 没有关系啊,这个是 SqlAlchemy,这里你可能指 flask-sqlalchemy 。这个删除外键就可以了,但是删除之后做联结查询会变慢,而创建过程会加快。如果你想清空 roles_rights 而不想影响其他两张表,建议直接用 sql 来删除。如果非要用代码来做,那如 @encro 所言,你需要把 right 和 role 两张表外键处允许为空,然后直接写一个 class 没有外键的,然后把它删除就可以了。你可以用 class 的 mixin 写法来组合你的 fields 。
334862132
2020-04-29 08:11:37 +08:00
@more1sec
我过去公司也没有外键,现在看着外键卡的太恶心了
334862132
2020-04-29 08:13:04 +08:00
@Philippa
解决了,没用 sql 原生写,全篇代码都没用 sql 原生,我要用 sql 原生太破坏美感了,直接先删除,在插入以达到升级效果,虽然看着蛋疼,但是好歹能用....
johnsona
2020-04-29 14:08:21 +08:00
@Philippa mixin 是这么做的?
Philippa
2020-04-29 23:07:37 +08:00
@jsisjs20130824 语法糖,将继承了 sqlachemy 的 model 的 class 相互继承

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/666995

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX