1) 确保表里的字段都缺一不可(也就是具有原子性)
2) 确保表里的字段都和主键直接相关
[命令] Linux 命令 fdisk (硬盘的分区和显示)
内容一:给一个硬盘分区
# fdisk /dev/sda
(补充:这里以给 /dev/sda 硬盘分区为例,键入以上命令之后,可以根据提示进行分区操作)
内容二:显示已有分区情况
# fdisk -l
[工具] Python 一个脚本调用另一个脚本
介绍
使用方法
1. 将第 1 个脚本命名为 test_main.py,将第 2 个脚本命名为 test_sub.py,并将它们放在同一个目录下
2. 给 2 个脚本添加执行权限
3. 用 python3 命令执行第 1 个脚本
第一个脚本
import subprocess
test=subprocess.Popen(['python3', './test_sub.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
out=test.decode().strip()
print(out)
第二个脚本
def sum(a,b):
return(a + b)
c = 4
b = 2
print(sum(c,b))
[实验] Django 实现数据原子性
注意:
本实验是接着 《Django 自定义逻辑添加(通过自定义 save 对象实现)(一次性完成多对多表数据的插入)》而继续的
正文:
将 mysite/user/models.py 中的以下内容:
class Clazz(models.Model):
cname = models.CharField(max_length=30)
class Student(models.Model):
sname = models.CharField(max_length=30)
score = models.PositiveBigIntegerField()
cls = models.ForeignKey(Clazz,on_delete=models.CASCADE)
def __str__(self):
return u'Student:%s,%s'%(self.sname,self.score)
def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
try:
self.cls = Clazz.objects.get(cname=self.cls.cname)
except Clazz.DoesNotExist:
self.cls = Clazz.objects.create(cname=self.cls.cname)
#Insertion of student table
models.Model.save(self, force_insert=False, force_update=False,using=None, update_fields=None)
修改为:
class Clazz(models.Model):
cname = models.CharField(max_length=30)
class Student(models.Model):
sname = models.CharField(max_length=30)
score = models.PositiveBigIntegerField()
cls = models.ForeignKey(Clazz,on_delete=models.CASCADE)
def __str__(self):
return u'Student:%s,%s'%(self.sname,self.score)
from django.db.transaction import atomic
@atomic
def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
try:
self.cls = Clazz.objects.get(cname=self.cls.cname)
except Clazz.DoesNotExist:
self.cls = Clazz.objects.create(cname=self.cls.cname)
#Insertion of student table
models.Model.save(self, force_insert=False, force_update=False,using=None, update_fields=None)
[实验] Django 数据修改
注意:
本实验是接着 《Django 最大值、最小值、平均值等特殊数值的数据查询》而继续的
正文:
步骤一:进入相应的 Django 环境
(django_env) [root@python mysite]# python3
>>> import os,django
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'
>>> django.setup()
>>> from user.models import *
步骤二:导入数据修改 F 模块
>>> from django.db.models import Q,F
(补充:这里同时也倒入了 Q 模块,后面的实验会用到 Q 模块)
步骤三:设置一个显示上一句 SQL 语句的函数
>>> def showsql():
... from django.db import connection
... print(connection.queries[-1]['sql'])
...
步骤四:进行数据修改
4.1 单独修改某 1 条数据
4.1.1 单独修改某 1 条数据
>>> Student.objects.filter(id=3).update(score=F('score')+5)
1
(
补充:
1) 这里以给 id 等于 3 的数据的 score 值添加 5 为例
2) 这里共修改了 1 条数据
)
4.1.2 显示单独修改某 1 条数据 SQL 语句
>>> showsql()
UPDATE `user_student` SET `score` = (`user_student`.`score` + 5) WHERE `user_student`.`id` = 3
(补充:这里以给 id 等于 3 的数据的 score 值添加 5 为例)
4.2 批量修改数据
4.2.1 批量修改数据
>>> Student.objects.filter(Q(id__gt=3)).update(score=F('score')+5)
3
(
补充:
1) 这里以给 id 大于 3 的数据的 score 值添加 5 为例
2) 这里共修改了 3 条数据
)
4.2.2 显示批量修改数据的 SQL 语句
>>> showsql()
UPDATE `user_student` SET `score` = (`user_student`.`score` + 5) WHERE `user_student`.`id` > 3
(补充:这里以给 id 大于 3 的数据的 score 值添加 5 为例)
补充:get 无法对获得的结果进行操作
>>> Student.objects.get(id=3).update(score=33)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'update'
(
补充:
1) 前面 filter 返回结果是 QuerySet,所以可以被 update 操作
2) 现在 get 的返回结果是 1 个对象,所以不能被 update 操作
)