ORM 连表操作

import os

if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings")
    import django
    django.setup()

    from app01 import models
    #ORM分组查询 每个部门名称及部门的平均工资

    ret = models.Employee.objects.all()
    """
    SELECT `employee`.`id`, `employee`.`name`, `employee`.`age`, `employee`.`salary`, `employee`.`province`,              `employee`.`dept` FROM `employee` LIMIT 21; args=()
    """
    print(ret)
  
    ret = models.Employee.objects.all().values("dept", "age")
    """
    SELECT `employee`.`dept`, `employee`.`age` FROM `employee` LIMIT 21; args=()
    """
    print(ret)

    ret = models.Employee.objects.all().values_list("dept", "age")
    """
    SELECT `employee`.`dept`, `employee`.`age` FROM `employee` LIMIT 21; args=()
    """
    print(ret)

    from django.db.models import Avg
    ret = models.Employee.objects.values("dept").annotate(a=Avg("salary")).values("dept", "a")
    """
    SELECT `employee`.`province`, AVG(`employee`.`salary`) AS `a` FROM `employee` GROUP BY `employee`.`province` ORDER BY NULL LIMIT 21; args=()
    """
    print(ret)

    # ORM连表分组查询
    ret = models.Person.objects.values("dept_id").annotate(a=Avg("salary")).values("dept__name", "a")
    """
    SELECT `dept`.`name`, AVG(`person`.`salary`) AS `a` FROM `person` INNER JOIN `dept` ON (`person`.`dept_id` = `dept`.`id`) GROUP BY `person`.`dept_id`, `dept`.`name` ORDER BY NULL LIMIT 21; args=()
    """
    print(ret)

    # 查询person表,判断每个人的工资是否大于2000
    ret = models.Person.objects.filter(salary__gt=5000)
    """
     SELECT `person`.`id`, `person`.`name`, `person`.`salary`, `person`.`dept_id` FROM `person` WHERE `person`.`salary` > 5000 LIMIT 21; args=(5000,)
    """
    
    print(ret)

    # 查询person表,判断每个人的工资是否大于2000
    ret = models.Person.objects.all().extra(
        select={"gt": "salary > 5000"}
    )

    """
    SELECT (salary > 2000) AS `gt`, `person`.`id`, `person`.`name`, `person`.`salary`, `person`.`dept_id` FROM `person` LIMIT 21; args=()
    """
    for i in ret:
        print(i.name, i.gt)

    # 执行原生的SQL语句
    from django.db import connection
    cursor = connection.cursor()  # 获取光标,等待执行SQL语句
    cursor.execute("SELECT * from person where id = %s", [2])
    row = cursor.fetchone()
    print(row)



class Employee(models.Model):
    name = models.CharField(max_length=16, unique=True)
    age = models.IntegerField()
    salary = models.IntegerField()
    province = models.CharField(max_length=32,verbose_name="省份")
    dept = models.CharField(max_length=16)

    def __str__(self):
        return self.name

    class Meta:
        db_table = "employee"

class Dept(models.Model):
    """
    部门表
    """
    name = models.CharField(max_length=16)

    def __str__(self):
        return self.name

    class Meta:
        db_table = "dept"

class Person(models.Model):
    """
    员工表
    """
    name = models.CharField(max_length=16)
    salary = models.IntegerField()
    dept = models.ForeignKey(to="Dept")

    def __str__(self):
        return self.name

    class Meta:
        db_table = "person"

猜你喜欢

转载自blog.csdn.net/weixin_42506747/article/details/82011048