我正在进行数据库迁移,我需要确保(暂时)没有为某些表创建新项目。
我如何做以下事项:
class Table1:
...
def save(self, *args, **kwargs):
if not self.pk:
raise
super(Table1, self).save(*args, **kwargs)
对这五个表格执行上述模式:
- Table1
- Table2
- Table3
- Table4
- Table5
我可以在信号或其他内容中定义它,以便更容易添加/删除吗?
答案 0 :(得分:0)
是的,您可以使用信号。例如:
from django.db.models.signals import pre_delete, pre_save
def block_writes(sender, **kwargs):
if sender in (Table1, Table2, Table3, Table4, Table5):
raise Exception("Writes blocked for these tables right now")
# To start blocking
pre_delete.connect(block_writes)
pre_save.connect(block_writes)
# To stop
pre_delete.disconnect(block_writes)
pre_save.disconnect(block_writes)
这不会停止所有写入,但不能,因为他们不会发送所有信号。例如,Model.objects.update()
将继续工作,以及原始SQL查询。我确定还有其他写作路径,我也错过了。
此外,如果您只是在迁移过程编辑表时尝试停止Web服务器进程的写入,则可以使用表锁。如果您使用的是MySQL,django-mysql
中的上下文管理员可以在您的模型上处理这些内容。'表。