這篇文章主要為大家展示了“如何使用Oracle中的emp、dept來(lái)學(xué)習(xí)Django ORM”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何使用Oracle中的emp、dept來(lái)學(xué)習(xí)Django ORM”這篇文章吧。
創(chuàng)新互聯(lián)專注于安岳網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供安岳營(yíng)銷型網(wǎng)站建設(shè),安岳網(wǎng)站制作、安岳網(wǎng)頁(yè)設(shè)計(jì)、安岳網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造安岳網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供安岳網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
學(xué)習(xí)Django的時(shí)候,總是覺得這部分內(nèi)容和實(shí)際的應(yīng)用有一定的差別或者距離。一方面Django自帶的ORM對(duì)于底層數(shù)據(jù)庫(kù)來(lái)說(shuō)是一種適配性很強(qiáng)的組件,可以不強(qiáng)依賴于某一種數(shù)據(jù)庫(kù),sqlite,MySQL,Oracle,PG等等都可以,學(xué)習(xí)起來(lái)需要一定的周期。另外一方面是因?yàn)檫@種方式是通用的API,一下子沒有了SQL語(yǔ)句,要理解并接受這種思想,需要一點(diǎn)時(shí)間,對(duì)很多DBA來(lái)說(shuō)需要適應(yīng)。第三點(diǎn)就是沒有融會(huì)貫通,好像看明白了,但是實(shí)際寫的時(shí)候發(fā)現(xiàn)還是摸黑,不知道從何入手。
所以我就換個(gè)思路,從數(shù)據(jù)庫(kù)的角度來(lái)反向解析Django怎么實(shí)現(xiàn)我們常見的數(shù)據(jù)需求。先做減法,側(cè)重于說(shuō)查詢的部分。常見的數(shù)據(jù)需求,這個(gè)需求有些大,怎么讓他更通用呢,我想到了Oracle里面的emp,dept,自打?qū)W習(xí)數(shù)據(jù)庫(kù),很多的測(cè)試案例就和這兩個(gè)表分不開,所以我們就從這個(gè)為切入點(diǎn)來(lái)逐步分析。
有的同學(xué)可能開始就打了退堂鼓,Oracle的還要轉(zhuǎn)換語(yǔ)句,還有數(shù)據(jù)類型,而使用的數(shù)據(jù)庫(kù)是MySQL,是不是有些麻煩啊,其實(shí)這些都不是事兒,不花一點(diǎn)功夫肯定難有收獲。
我們配置下emp,dept的結(jié)構(gòu),是在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)
其實(shí)內(nèi)容來(lái)看倒也不難,類型是通用的。
使用python manage.py makemigrations得到變化的結(jié)構(gòu)和數(shù)據(jù)
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;
簡(jiǎn)單確認(rèn)下,我們就可以生成創(chuàng)建出來(lái)這兩個(gè)表了,使用python manage.py migrate即可。
emp的表結(jié)構(gòu)如下:
dept的表結(jié)構(gòu)如下:
我們初始化一下數(shù)據(jù),這個(gè)時(shí)候直接使用SQL也可以.
dept表的初始化語(yǔ)句如下:
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表的初始化語(yǔ)句如下,特別需要注意的就是字段不是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);
剩下的事情就是實(shí)踐了。我們就選擇emp,dept常見的一些SQL來(lái)看看ORM能否完成這個(gè)任務(wù)。
1、顯示所有的姓名、工種、工資和獎(jiǎng)金,按工種降序排列,若工種相同則按工資升序排列。
如果使用MySQL,語(yǔ)句和數(shù)據(jù)結(jié)果如下:
mysql> select ename,job,sal from emp order by job desc,sal asc; +----------+-----------+------+ | ename | job | sal | +----------+-----------+------+ | WARD | SALESMAN | 1250 | | MARTIN | SALESMAN | 1250 |
使用order_by的方式來(lái)處理,可以看到有了一點(diǎn)頭緒,但是還是沒有實(shí)現(xiàn)需求。
>>> emp.objects.all().order_by('job') [<emp: 7788 SCOTT>, <emp: 7902 FORD>, <emp: 7369 SMITH>, ....
所以我們的重點(diǎn)就是排序了,ORM本身有order_by函數(shù),還可以調(diào)整DESC,ASC,所以一個(gè)基本符合要求的方式如下:
>>> emp.objects.all().order_by(('-job'),('sal')) [<emp: 7521 WARD>, <emp: 7654 MARTIN>, <emp: 7844 TURNER>
第二個(gè)題目也是類似的。
2、查詢員工的姓名和入職日期,并按入職日期從先到后進(jìn)行排列。
SQL語(yǔ)句如下:
select ename,hiredate from emp order by hiredate asc;
現(xiàn)在的語(yǔ)句如下:
emp.objects.all().order_by(('hiredate'))
3. 計(jì)算工資***的員工
這個(gè)需求充分考慮到聚合函數(shù)的部分,我們可以使用aggregate來(lái)完成這個(gè)工作。
>>> emp.objects.all().aggregate(Max('sal')) {'sal__max': 5000}
4.查詢至少有一個(gè)員工的部門信息。
這個(gè)部分會(huì)涉及到表關(guān)聯(lián)關(guān)系,如果是通過(guò)SQL的方式,語(yǔ)句如下:
select * from dept where deptno in (select distinct deptno from emp where mgr is not null);
執(zhí)行的結(jié)果如下,可以看到***種方式能出結(jié)果,但是還是存在重復(fù)值,需要用distinct過(guò)啦一下。
>>> 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來(lái)學(xué)習(xí)Django ORM”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)站標(biāo)題:如何使用Oracle中的emp、dept來(lái)學(xué)習(xí)DjangoORM
標(biāo)題路徑:http://muchs.cn/article32/gjsesc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、軟件開發(fā)、網(wǎng)站策劃、網(wǎng)站導(dǎo)航、定制網(wǎng)站、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)