V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
334862132
V2EX  ›  Python

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

  •  
  •   334862132 · 2020-04-28 16:56:18 +08:00 · 2640 次点击
    这是一个创建于 1670 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个中间表
    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')))
    12 条回复    2020-04-29 23:07:37 +08:00
    334862132
        1
    334862132  
    OP
       2020-04-28 16:58:42 +08:00
    我现在只想删除 roles_rights 表的数据,但是现在想删除的话必须要把 role 对应的数据删掉,求问,模型如何能在不动其他外键表的情况下只删除 roles_rights 表的数据
    XGF
        2
    XGF  
       2020-04-28 17:17:18 +08:00
    去掉 db.ForeignKey
    334862132
        3
    334862132  
    OP
       2020-04-28 17:19:59 +08:00
    @XGF 把 db.ForeignKey 去掉了,添加时候不就出问题了....
    模型好麻烦,还是 sql 原生写起来舒服....
    more1sec
        4
    more1sec  
       2020-04-28 18:43:39 +08:00   ❤️ 1
    我以前的公司,全部表都没用外键,靠业务代码维护数据一致性
    encro
        5
    encro  
       2020-04-28 19:38:25 +08:00
    db.ForeignKey 有参数,可以设置不嵌套删除,
    然后 db.Column 有参数可以设置允许为 null,

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

    哎呀,怎么是 flask 不是 django?
    应该也差不多。
    hmxxmh
        6
    hmxxmh  
       2020-04-28 19:44:30 +08:00 via Android
    @more1sec 我也喜欢通过业务逻辑关联,比外键好用吧
    saulshao
        7
    saulshao  
       2020-04-28 20:13:35 +08:00
    Django 允许在定义模型的时候,显式指定不要使用数据库中的外键
    Philippa
        8
    Philippa  
       2020-04-29 02:05:11 +08:00
    这个和 flask 没有关系啊,这个是 SqlAlchemy,这里你可能指 flask-sqlalchemy 。这个删除外键就可以了,但是删除之后做联结查询会变慢,而创建过程会加快。如果你想清空 roles_rights 而不想影响其他两张表,建议直接用 sql 来删除。如果非要用代码来做,那如 @encro 所言,你需要把 right 和 role 两张表外键处允许为空,然后直接写一个 class 没有外键的,然后把它删除就可以了。你可以用 class 的 mixin 写法来组合你的 fields 。
    334862132
        9
    334862132  
    OP
       2020-04-29 08:11:37 +08:00
    @more1sec
    我过去公司也没有外键,现在看着外键卡的太恶心了
    334862132
        10
    334862132  
    OP
       2020-04-29 08:13:04 +08:00
    @Philippa
    解决了,没用 sql 原生写,全篇代码都没用 sql 原生,我要用 sql 原生太破坏美感了,直接先删除,在插入以达到升级效果,虽然看着蛋疼,但是好歹能用....
    johnsona
        11
    johnsona  
       2020-04-29 14:08:21 +08:00
    @Philippa mixin 是这么做的?
    Philippa
        12
    Philippa  
       2020-04-29 23:07:37 +08:00 via iPhone
    @jsisjs20130824 语法糖,将继承了 sqlachemy 的 model 的 class 相互继承
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2781 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:03 · PVG 16:03 · LAX 00:03 · JFK 03:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.