|
|
|
from orm_demo.models import *
|
|
|
|
from django.db.models import F, Q, Count
|
|
|
|
from django.db import connection
|
|
|
|
|
|
|
|
# 插入数据
|
|
|
|
# 先实例化对象,然后为对象赋值
|
|
|
|
depart_data = DepartInfo()
|
|
|
|
depart_data.depart_name = '开发部'
|
|
|
|
depart_data.save()
|
|
|
|
|
|
|
|
# 实例化对象同时赋值
|
|
|
|
skill_data = SkillInfo(skill_name='PHP')
|
|
|
|
skill_data.save()
|
|
|
|
|
|
|
|
# create方法赋值
|
|
|
|
user = BaseUserInfo.objects.create(username='张三', password='zhangsan', status=1)
|
|
|
|
|
|
|
|
# create方式赋值, 字典格式数据
|
|
|
|
data = {'username': '李四', 'password': 'lisi', 'status': 1}
|
|
|
|
# data2 = dict(username='李四', password='lisi', status=1) # 另一种字典数据定义形势
|
|
|
|
user2 = BaseUserInfo.objects.create(**data)
|
|
|
|
|
|
|
|
# 批量插入
|
|
|
|
data_list = [
|
|
|
|
{'username': '王五', 'password': 'wangwu', 'status': 1},
|
|
|
|
{'username': '孙六', 'password': 'sunliu', 'status': 1}
|
|
|
|
]
|
|
|
|
user_obj_list = []
|
|
|
|
for data in data_list:
|
|
|
|
user_obj = BaseUserInfo(username=data['username'], password=data['password'], status=data['status'])
|
|
|
|
user_obj_list.append(user_obj)
|
|
|
|
users = BaseUserInfo.objects.bulk_create(user_obj_list)
|
|
|
|
|
|
|
|
# 插入外键关联的数据
|
|
|
|
user1 = BaseUserInfo.objects.filter(username='张三').first()
|
|
|
|
department1 = DepartInfo.objects.filter(depart_name='开发部').first()
|
|
|
|
user_e1 = UserExtendInfo(username='张三', true_name='张三丰', sex=1, age=33, department='开发部', salary='230000.00',
|
|
|
|
status=1, memo='', user=user1, depart=department1)
|
|
|
|
user_e1.save()
|
|
|
|
|
|
|
|
# 插入ManyToMany字段数据add()和set()
|
|
|
|
skill_php = SkillInfo.objects.filter(skill_name='PHP').first()
|
|
|
|
user_zhang = UserExtendInfo.objects.filter(username='张三').first()
|
|
|
|
skill_php.user.add(user_zhang) # 使用add方法添加外键关联关系
|
|
|
|
|
|
|
|
# 一次建立多个连接关系
|
|
|
|
skill_py = SkillInfo.objects.filter(skill_name='Python').first()
|
|
|
|
user_zhang = UserExtendInfo.objects.filter(username='张三').first()
|
|
|
|
user_sun = UserExtendInfo.objects.filter(username='孙六').first()
|
|
|
|
skill_py.user.add(user_zhang, user_sun) # add方法可以添加多个关联关系
|
|
|
|
|
|
|
|
# 直接创建关联关系数据
|
|
|
|
skill_draw = SkillInfo.objects.filter(skill_name='draw').first()
|
|
|
|
user_zhou = BaseUserInfo.objects.filter(username='周七').first()
|
|
|
|
depart_zhou = DepartInfo.objects.filter(depart_name='设计部').first()
|
|
|
|
skill_draw.user.create(username='周七', true_name='周七天', sex=0, age=18, department='设计部', salary='8500.00',
|
|
|
|
status=1, memo='', user=user_zhou, depart=depart_zhou)
|
|
|
|
|
|
|
|
# 使用set修改关联数据
|
|
|
|
user_design = UserExtendInfo.objects.filter(department='设计部').all()
|
|
|
|
skill_ps = SkillInfo.objects.get(skill_name='Photoshop')
|
|
|
|
skill_ps.user.set(user_design)
|
|
|
|
|
|
|
|
# 直接给定id
|
|
|
|
skill_draw = SkillInfo.objects.get(skill_name='draw')
|
|
|
|
skill_draw.user.set([3])
|
|
|
|
|
|
|
|
# 批量关联多对多数据
|
|
|
|
skill_dev = SkillInfo.objects.filter(skill_name__in=['JavaScript', 'PHP']).all()
|
|
|
|
user_dev = UserExtendInfo.objects.filter(department='开发部').all()
|
|
|
|
for skill in skill_dev:
|
|
|
|
skill.user.add(*user_dev)
|
|
|
|
|
|
|
|
# 更新数据
|
|
|
|
# 查询出结果后通过赋值方式使用save方法保存
|
|
|
|
skill_data = SkillInfo.objects.filter(skill_name='测试').first()
|
|
|
|
skill_data.skill_name = 'Test'
|
|
|
|
skill_data.save()
|
|
|
|
|
|
|
|
# 使用update方式直接修改
|
|
|
|
skill_data1 = SkillInfo.objects.filter(skill_name='画图').update(skill_name='draw')
|
|
|
|
|
|
|
|
# 删除数据 返回删除结果 (2, {'orm_demo.SkillInfo': 2})
|
|
|
|
SkillInfo.objects.create(skill_name='delete')
|
|
|
|
SkillInfo.objects.create(skill_name='delete')
|
|
|
|
del_skill = SkillInfo.objects.filter(skill_name='delete').delete()
|
|
|
|
print(del_skill)
|
|
|
|
|
|
|
|
# 关联表查询 一对一
|
|
|
|
# 通过扩展表名查询
|
|
|
|
user_li = BaseUserInfo.objects.filter(username='李四').first()
|
|
|
|
print(user_li.userextendinfo.true_name) # 扩展表名需要小写, 返回:李四喜
|
|
|
|
|
|
|
|
# 通过关联字段查询
|
|
|
|
user_extend_li = UserExtendInfo.objects.filter(true_name__contains='李四').first()
|
|
|
|
print(user_extend_li.user.password) # 使用关联字段名称, 返回:lisi
|
|
|
|
|
|
|
|
# 关联表查询 一对多
|
|
|
|
# 正向查询
|
|
|
|
user_zhang = BaseUserInfo.objects.get(id=1)
|
|
|
|
card_zhang = user_zhang.cardinfo_set.all() # 使用小写的表名加上_set做为关联字段
|
|
|
|
for card in card_zhang:
|
|
|
|
print(card.card_no)
|
|
|
|
|
|
|
|
# 正向查询 related_name 指定关联名称
|
|
|
|
user_zhang = BaseUserInfo.objects.get(id=1)
|
|
|
|
card_zhang = user_zhang.user_card.all() # 使用指定的关联名做为关联字段
|
|
|
|
for card in card_zhang:
|
|
|
|
print(card.card_no)
|
|
|
|
|
|
|
|
# 反向查询
|
|
|
|
card = CardInfo.objects.filter(user_id=1).first()
|
|
|
|
print(card.user.username)
|
|
|
|
|
|
|
|
# 多对多查询
|
|
|
|
# 正向查询
|
|
|
|
user_zhang = UserExtendInfo.objects.get(username='张三')
|
|
|
|
skill_user_zhang = user_zhang.skillinfo_set.all()
|
|
|
|
print(skill_user_zhang)
|
|
|
|
|
|
|
|
# 反向查询
|
|
|
|
skill_py = SkillInfo.objects.filter(skill_name='Python').first()
|
|
|
|
for user in skill_py.user.all():
|
|
|
|
print(user.true_name)
|
|
|
|
|
|
|
|
# 多对多删除关联数据 remove clear
|
|
|
|
# 删除指定用户的指定技能
|
|
|
|
user_del = UserExtendInfo.objects.get(id=5)
|
|
|
|
skill_del = SkillInfo.objects.get(id=7)
|
|
|
|
result = skill_del.user.remove(user_del)
|
|
|
|
print(result)
|
|
|
|
|
|
|
|
# 通过id指定删除哪个用户
|
|
|
|
skill_del = SkillInfo.objects.get(id=1)
|
|
|
|
result = skill_del.user.remove(2)
|
|
|
|
print(result)
|
|
|
|
|
|
|
|
# 清除全部
|
|
|
|
skill_del = SkillInfo.objects.get(id=8)
|
|
|
|
result = skill_del.user.clear()
|
|
|
|
print(result)
|
|
|
|
|
|
|
|
# ForeignKey 直接获取关联表数据, 只能用在一对多设置外键的情况
|
|
|
|
card_data = CardInfo.objects.select_related('user')
|
|
|
|
for card in card_data:
|
|
|
|
print(card.user)
|
|
|
|
|
|
|
|
# ManyToMany 多对多直接获取关联表数据
|
|
|
|
skill_data = SkillInfo.objects.prefetch_related('user')
|
|
|
|
for skill in skill_data:
|
|
|
|
print(skill.skill_name)
|
|
|
|
users = skill.user.all()
|
|
|
|
for user in users:
|
|
|
|
print(user.true_name)
|
|
|
|
|
|
|
|
# F()函数
|
|
|
|
users = UserExtendInfo.objects.all()
|
|
|
|
for user in users:
|
|
|
|
user.salary = F('salary') + 1000
|
|
|
|
user.save()
|
|
|
|
for user in users:
|
|
|
|
user.refresh_from_db()
|
|
|
|
print(user.salary)
|
|
|
|
|
|
|
|
# Q()函数 用于多条件查询
|
|
|
|
user = UserExtendInfo.objects.filter(Q(age__gt=30) & Q(salary__gt=10000)).first()
|
|
|
|
print(user.username)
|
|
|
|
|
|
|
|
# 执行原生SQL
|
|
|
|
users = UserExtendInfo.objects.raw("SELECT * FROM orm_user_base_info")
|
|
|
|
for user in users:
|
|
|
|
print(type(user), user.username)
|
|
|
|
|
|
|
|
sql = "SELECT * FROM orm_user_extend_info WHERE age > %s and salary > %s"
|
|
|
|
users = UserExtendInfo.objects.raw(sql, [30, 10000])
|
|
|
|
for user in users:
|
|
|
|
print(type(user), user.username)
|
|
|
|
|
|
|
|
# connect 游标
|
|
|
|
# 插入数据
|
|
|
|
import django.utils.timezone as timezone
|
|
|
|
|
|
|
|
time_now = timezone.now()
|
|
|
|
cursor = connection.cursor()
|
|
|
|
sql = "INSERT INTO orm_skill_info (skill_name, createDate) VALUES (%s, %s)"
|
|
|
|
cursor.execute(sql, ('selenium', time_now))
|
|
|
|
cursor.close()
|
|
|
|
|
|
|
|
# 查询数据
|
|
|
|
sql = "SELECT * FROM orm_user_extend_info"
|
|
|
|
cursor = connection.cursor()
|
|
|
|
cursor.execute(sql)
|
|
|
|
row = cursor.fetchone()
|
|
|
|
print(row)
|
|
|
|
cursor.close()
|
|
|
|
|
|
|
|
# 更新数据
|
|
|
|
cursor = connection.cursor()
|
|
|
|
try:
|
|
|
|
update_sql = "UPDATE orm_depart_info SET depart_name = %s WHERE id = %s"
|
|
|
|
data = ('开发部', 1)
|
|
|
|
cursor.execute(update_sql, data)
|
|
|
|
rowcount = cursor.rowcount
|
|
|
|
print(rowcount)
|
|
|
|
connection.commit()
|
|
|
|
except Exception as e:
|
|
|
|
print(e)
|
|
|
|
connection.rollback()
|
|
|
|
finally:
|
|
|
|
cursor.close()
|
|
|
|
|
|
|
|
# 事务处理 transaction
|
|
|
|
from django.db import transaction
|
|
|
|
|
|
|
|
|
|
|
|
# 方式1:修饰器
|
|
|
|
|
|
|
|
@transaction.atomic
|
|
|
|
def trans(request):
|
|
|
|
save_id = transaction.savepoint() # 开启事件
|
|
|
|
try:
|
|
|
|
# somecode
|
|
|
|
transaction.savepoint_commit(save_id) # 提交事件
|
|
|
|
except Exception as e:
|
|
|
|
print(e)
|
|
|
|
transaction.savepoint_rollback(save_id) # 回滚事件
|
|
|
|
|
|
|
|
|
|
|
|
# 方式2: with语句
|
|
|
|
|
|
|
|
def trans_with(request):
|
|
|
|
with transaction.atomic():
|
|
|
|
save_id = transaction.savepoint() # 开启事件
|
|
|
|
try:
|
|
|
|
# some code
|
|
|
|
transaction.commit(save_id) # 提交事件
|
|
|
|
except Exception as e:
|
|
|
|
print(e)
|
|
|
|
transaction.rollback(save_id) # 回滚事件
|
|
|
|
|
|
|
|
|
|
|
|
# 基本查询
|
|
|
|
# get 当查询结果多余一条时报错
|
|
|
|
user = BaseUserInfo.objects.get(id=2)
|
|
|
|
print(user)
|
|
|
|
|
|
|
|
# exclude 排除查询出来的数据
|
|
|
|
users = UserExtendInfo.objects.exclude(age__lt=30)
|
|
|
|
for user in users:
|
|
|
|
print(user.true_name)
|
|
|
|
|
|
|
|
# filter 过滤数据
|
|
|
|
users = UserExtendInfo.objects.filter(Q(age__gte=30) & Q(department__in=['开发部', '测试部']))
|
|
|
|
for user in users:
|
|
|
|
print(user.true_name)
|
|
|
|
|
|
|
|
# __gt __gte __lt __lte __in __contains __year __month __day
|
|
|
|
users = BaseUserInfo.objects.filter(username__contains="孙")
|
|
|
|
for user in users:
|
|
|
|
print(user)
|
|
|
|
|
|
|
|
users = BaseUserInfo.objects.filter(create_date__year='2023')
|
|
|
|
for user in users:
|
|
|
|
print(user.create_date)
|
|
|
|
|
|
|
|
users = BaseUserInfo.objects.filter(create_date__day='08')
|
|
|
|
for user in users:
|
|
|
|
print(user.create_date)
|
|
|
|
|
|
|
|
# values 用于指定显示具体字段
|
|
|
|
users = UserExtendInfo.objects.filter(username='张三').values('username', 'true_name', 'salary')
|
|
|
|
for user in users:
|
|
|
|
print(user)
|
|
|
|
print(user['true_name'])
|
|
|
|
|
|
|
|
# distinct 去重
|
|
|
|
departs = UserExtendInfo.objects.distinct().values('department')
|
|
|
|
for d in departs:
|
|
|
|
print(d)
|
|
|
|
|
|
|
|
# 链式过滤器
|
|
|
|
users = UserExtendInfo.objects.filter(age__range=[20, 30]).exclude(salary__lt=17000)
|
|
|
|
for user in users:
|
|
|
|
print(user.username)
|
|
|
|
|
|
|
|
# 结果切片
|
|
|
|
skills = SkillInfo.objects.all()[1:3]
|
|
|
|
print(skills)
|
|
|
|
|
|
|
|
# 排序 order_by
|
|
|
|
user_salary = UserExtendInfo.objects.order_by('salary').all()
|
|
|
|
for user in user_salary:
|
|
|
|
print(user.salary)
|
|
|
|
|
|
|
|
# 排序 desc
|
|
|
|
user_salary = UserExtendInfo.objects.order_by(F('salary').desc())
|
|
|
|
for user in user_salary:
|
|
|
|
print(user.salary)
|
|
|
|
|
|
|
|
# 排序 asc
|
|
|
|
user_salary = UserExtendInfo.objects.order_by(F('salary').asc())
|
|
|
|
for user in user_salary:
|
|
|
|
print(user.salary)
|
|
|
|
|
|
|
|
# group_by query形式
|
|
|
|
users = UserExtendInfo.objects.all()
|
|
|
|
users.query.group_by = ['department']
|
|
|
|
for user in users:
|
|
|
|
print(user.username, user.department)
|
|
|
|
|
|
|
|
# group_by aggregated count
|
|
|
|
users = UserExtendInfo.objects.values('username').aaggregate(count=Count('department'))
|
|
|
|
print(users)
|
|
|
|
|
|
|
|
# count
|
|
|
|
|
|
|
|
|
|
|
|
# sum
|
|
|
|
|
|
|
|
# UNION
|
|
|
|
|
|
|
|
|
|
|
|
# JOIN
|