我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用Oracle中的emp、dept来学习Django ORM

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用Oracle中的emp、dept来学习Django ORM

这篇文章主要为大家展示了“如何使用Oracle中的emp、dept来学习Django ORM”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用Oracle中的emp、dept来学习Django ORM”这篇文章吧。

学习Django的时候,总是觉得这部分内容和实际的应用有一定的差别或者距离。一方面Django自带的ORM对于底层数据库来说是一种适配性很强的组件,可以不强依赖于某一种数据库,sqlite,MySQL,Oracle,PG等等都可以,学习起来需要一定的周期。另外一方面是因为这种方式是通用的API,一下子没有了SQL语句,要理解并接受这种思想,需要一点时间,对很多DBA来说需要适应。第三点就是没有融会贯通,好像看明白了,但是实际写的时候发现还是摸黑,不知道从何入手。

所以我就换个思路,从数据库的角度来反向解析Django怎么实现我们常见的数据需求。先做减法,侧重于说查询的部分。常见的数据需求,这个需求有些大,怎么让他更通用呢,我想到了Oracle里面的emp,dept,自打学习数据库,很多的测试案例就和这两个表分不开,所以我们就从这个为切入点来逐步分析。

有的同学可能开始就打了退堂鼓,Oracle的还要转换语句,还有数据类型,而使用的数据库是MySQL,是不是有些麻烦啊,其实这些都不是事儿,不花一点功夫肯定难有收获。

我们配置下emp,dept的结构,是在Django的models.py的文件中配置即可。

from django.db import models  import django.utils.timezone as timezone    class dept(models.Model):      deptno = models.AutoField(primary_key=True)      dname = models.CharField(max_length=30)      loc = models.CharField(max_length=30, default=' ')        class Meta:          db_table = 'dept'          verbose_name = 'DEPT'          verbose_name_plural = 'DEPT'          ordering = ['deptno']        def __unicode__(self):          return '%s %s' % (self.deptno, self.dname)    class dept(models.Model):      deptno = models.AutoField(primary_key=True)      dname = models.CharField(max_length=30)      loc = models.CharField(max_length=30, default=' ')        class Meta:          db_table = 'dept'          verbose_name = 'DEPT'          verbose_name_plural = 'DEPT'          ordering = ['deptno']        def __unicode__(self):          return '%s %s' % (self.deptno, self.dname)    class emp(models.Model):      empno = models.AutoField(primary_key=True)      ename = models.CharField(max_length=30)      job = models.CharField(max_length=30)      mgr = models.IntegerField()      hiredate = models.DateTimeField('hire date', default=timezone.now)      sal = models.IntegerField()      comm = models.IntegerField      deptno = models.ForeignKey('dept')        class Meta:          db_table = 'emp'          verbose_name = 'EMP'          verbose_name_plural = 'EMP'          verbose_name_plural = 'EMP'          ordering = ['empno', 'ename']        def __unicode__(self):          return '%s %s' % (self.empno, self.ename)

其实内容来看倒也不难,类型是通用的。

使用python manage.py makemigrations得到变化的结构和数据

Migrations for 'scott':    0001_initial.py:      - Create model dept      - Create model emp

得到的SQL如下:

>python manage.py sqlmigrate scott 0001  BEGIN;      CREATE TABLE "dept" ("deptno" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "dname" varchar(30) NOT NULL, "loc" varchar(30) NOT NULL);  CREATE TABLE "emp" ("empno" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "ename" varchar(30) NOT NULL, "job" varchar(30) NOT NULL, "mgr" integer NOT NULL  , "hiredate" datetime NOT NULL, "sal" integer NOT NULL, "deptno_id" integer NOT NULL REFERENCES "dept" ("deptno"));  CREATE INDEX "emp_d6b13549" ON "emp" ("deptno_id");  COMMIT;

简单确认下,我们就可以生成创建出来这两个表了,使用python manage.py migrate即可。

emp的表结构如下:

如何使用Oracle中的emp、dept来学习Django ORM

dept的表结构如下:

如何使用Oracle中的emp、dept来学习Django ORM

我们初始化一下数据,这个时候直接使用SQL也可以.

dept表的初始化语句如下:

insert into dept values(10,'ACCOUNTING','NEW YORK');  insert into dept values(20,'RESEARCH','DALLAS');  insert into dept values(30,'SALES','CHICAGO');  insert into dept values(40,'OPERATIONS','BOSTON');

emp表的初始化语句如下,特别需要注意的就是字段不是deptno,而是deptno_id

insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7369,'SMITH','CLERK',7902,'1980-12-17',800.00,20);  insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7499,'ALLEN','SALESMAN',7698,'1981-2-20',1600.00,30);  insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7521,'WARD','SALESMAN',7698,'1981-2-22',1250.00,30);  insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7566,'JONES','MANAGER',7839,'1981-4-2',2975.00,20);  insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7654,'MARTIN','SALESMAN',7698,'1981-9-28',1250.00,30);  insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7698,'BLAKE','MANAGER',7839,'1981-5-1',2850.00,30);  insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7782,'CLARK','MANAGER',7839,'1981-6-9',2450.00,10);  insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7788,'SCOTT','ANALYST',7566,'1987--4-19',3000.00,20);  insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7839,'KING','PRESIDENT',0,'1981-11-17',5000.00,10);  insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7844,'TURNER','SALESMAN',7698,'1981-9-8',1500.00,30);  insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7876,'ADAMS','CLERK',7788,'1987-5-23',1100.00,20);  insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7900,'JAMES','CLERK',7698,'1981-12-3',950,30);  insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7902,'FORD','ANALYST',7566,'1981-12-3',3000,20);  insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7934,'MILLER','CLERK',7782,'1982-1-23',1300,10);  insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(9999,'SHUNPING','CLERK',7782,'1988-5-5',2456.34,10);

剩下的事情就是实践了。我们就选择emp,dept常见的一些SQL来看看ORM能否完成这个任务。

1、显示所有的姓名、工种、工资和奖金,按工种降序排列,若工种相同则按工资升序排列。

如果使用MySQL,语句和数据结果如下:

mysql> select ename,job,sal from emp order by job desc,sal asc;  +----------+-----------+------+  | ename    | job       | sal  |  +----------+-----------+------+  | WARD     | SALESMAN  | 1250 |  | MARTIN   | SALESMAN  | 1250 |

使用order_by的方式来处理,可以看到有了一点头绪,但是还是没有实现需求。

>>> emp.objects.all().order_by('job')  [<emp: 7788 SCOTT>, <emp: 7902 FORD>, <emp: 7369 SMITH>, ....

所以我们的重点就是排序了,ORM本身有order_by函数,还可以调整DESC,ASC,所以一个基本符合要求的方式如下:

>>> emp.objects.all().order_by(('-job'),('sal'))  [<emp: 7521 WARD>, <emp: 7654 MARTIN>, <emp: 7844 TURNER>

第二个题目也是类似的。

2、查询员工的姓名和入职日期,并按入职日期从先到后进行排列。

SQL语句如下:

select ename,hiredate from emp order by hiredate asc;

现在的语句如下:

emp.objects.all().order_by(('hiredate'))

3. 计算工资***的员工

这个需求充分考虑到聚合函数的部分,我们可以使用aggregate来完成这个工作。

>>> emp.objects.all().aggregate(Max('sal'))  {'sal__max': 5000}

4.查询至少有一个员工的部门信息。  

这个部分会涉及到表关联关系,如果是通过SQL的方式,语句如下:

select * from dept where deptno in (select distinct deptno from emp where mgr is not null);

执行的结果如下,可以看到***种方式能出结果,但是还是存在重复值,需要用distinct过啦一下。

>>> dept.objects.filter(emp__mgr__isnull=False)  [<dept: 10 ACCOUNTING>, <dept: 10 ACCOUNTING>, <dept: 10 ACCOUNTING>, <dept: 10 ACCOUNTING>, <dept: 20 RESEARCH>, <dept: 20 RESEARCH>, <dept: 20 RESEARCH>, <dept: 20 RESEARCH>, <dept: 20 RESEARCH>, <dept: 30 SALES>, <dept: 30 SALES>, <dept: 30 SALES>, <dept: 30 SALES>, <dept: 30 SALES>, <dept: 30 SALES>]  >>> dept.objects.filter(emp__mgr__isnull=False).distinct()  [<dept: 10 ACCOUNTING>, <dept: 20 RESEARCH>, <dept: 30 SALES>]  >>>

以上是“如何使用Oracle中的emp、dept来学习Django ORM”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用Oracle中的emp、dept来学习Django ORM

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用Oracle中的emp、dept来学习Django ORM

这篇文章主要为大家展示了“如何使用Oracle中的emp、dept来学习Django ORM”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用Oracle中的emp、dept来学习Djang
2023-06-17

如何在C++中使用机器学习库来增强数据分析?

在 c++++ 中使用机器学习库可以增强数据分析,具体步骤包括:选择适合需求的机器学习库,如 armadillo、eigen 和 tensorflow lite for microcontrollers。加载和预处理数据,选择机器学习算法,
如何在C++中使用机器学习库来增强数据分析?
2024-05-16

学习如何在Microsoft中查找使用PowerToys的文件

如果文件正由其他程序和进程使用,Windows 将阻止您对其进行更改。但是,它并不总是告诉您它们是哪些过程,这可能是一件令人沮丧的事情,尤其是当您被阻止继续工作时。尽管有一些方法可以解决此问题,但没有一种方法像PowerToys实用程序那样
2023-08-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录