如何在Django中实现类似Rails console --sandbox的数据库回滚Shell?
Django中实现类似Rails Sandbox Console的数据库回滚功能
当然可以!Django虽然没有内置和rails console --sandbox完全一模一样的命令,但我们可以通过两种简单的方式实现仅数据库操作自动回滚的需求,完全满足你测试数据库修改的场景:
方法一:用django-extensions的shell_plus --sandbox(最省心)
如果你已经装了django-extensions(很多Django开发者都会用这个工具集,它还带了一堆实用功能),直接跑这条命令就行:
python manage.py shell_plus --sandbox
启动后,所有数据库操作都会被包裹在一个事务里——不管你创建、更新还是删除记录,只要退出Shell,整个事务就会自动回滚,真实数据库里不会留下任何痕迹,和Rails的sandbox体验几乎完全一致。
方法二:手动在默认Django Shell里实现(无需额外安装)
如果不想加新依赖,也能手动搞定:
- 先启动普通的Django Shell:
python manage.py shell
- 进入Shell后,手动开启一个原子事务,并且设置退出时自动回滚:
from django.db import transaction # 开启事务 txn = transaction.atomic() txn.__enter__() # 接下来随便造数据就行,比如: from your_app.models import YourModel test_obj = YourModel(field="测试内容") test_obj.save() # 不管是手动调用回滚还是直接退出Shell,都会撤销所有操作 # 手动回滚可以用:txn.__exit__(None, None, None)
当你退出Shell时,这个未提交的事务会自动触发回滚,所有测试操作都不会影响真实数据库。
小提醒
这两种方式都只处理数据库操作的回滚,不会限制网络请求或其他外部调用,完全符合你只需要基础数据库回滚的需求。要是你经常用这个功能,强烈推荐装django-extensions,shell_plus平时开发还能自动导入所有模型,省不少事~
内容的提问来源于stack exchange,提问作者Ender
相关产品推荐
相关产品推荐

