日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
使用Oracle中的emp、dept來學(xué)習(xí)Django ORM

學(xué)習(xí)Django的時候,總是覺得這部分內(nèi)容和實(shí)際的應(yīng)用有一定的差別或者距離。一方面Django自帶的ORM對于底層數(shù)據(jù)庫來說是一種適配性很強(qiáng)的組件,可以不強(qiáng)依賴于某一種數(shù)據(jù)庫,sqlite,MySQL,Oracle,PG等等都可以,學(xué)習(xí)起來需要一定的周期。另外一方面是因?yàn)檫@種方式是通用的API,一下子沒有了SQL語句,要理解并接受這種思想,需要一點(diǎn)時間,對很多DBA來說需要適應(yīng)。第三點(diǎn)就是沒有融會貫通,好像看明白了,但是實(shí)際寫的時候發(fā)現(xiàn)還是摸黑,不知道從何入手。

創(chuàng)新互聯(lián)公司一直秉承“誠信做人,踏實(shí)做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個客戶多一個朋友!為您提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、成都網(wǎng)頁設(shè)計(jì)、成都微信小程序、成都網(wǎng)站開發(fā)、成都網(wǎng)站制作、成都軟件開發(fā)、成都App定制開發(fā)是成都本地專業(yè)的網(wǎng)站建設(shè)和網(wǎng)站設(shè)計(jì)公司,等你一起來見證!

所以我就換個思路,從數(shù)據(jù)庫的角度來反向解析Django怎么實(shí)現(xiàn)我們常見的數(shù)據(jù)需求。先做減法,側(cè)重于說查詢的部分。常見的數(shù)據(jù)需求,這個需求有些大,怎么讓他更通用呢,我想到了Oracle里面的emp,dept,自打?qū)W習(xí)數(shù)據(jù)庫,很多的測試案例就和這兩個表分不開,所以我們就從這個為切入點(diǎn)來逐步分析。

有的同學(xué)可能開始就打了退堂鼓,Oracle的還要轉(zhuǎn)換語句,還有數(shù)據(jù)類型,而使用的數(shù)據(jù)庫是MySQL,是不是有些麻煩啊,其實(shí)這些都不是事兒,不花一點(diǎn)功夫肯定難有收獲。

我們配置下emp,dept的結(jié)構(gòu),是在Django的models.py的文件中配置即可。

 
 
 
 
  1. from django.db import models 
  2.  
  3. import django.utils.timezone as timezone  
  4.  
  5.  
  6. class dept(models.Model): 
  7.  
  8.     deptno = models.AutoField(primary_key=True) 
  9.  
  10.     dname = models.CharField(max_length=30) 
  11.  
  12.     loc = models.CharField(max_length=30, default=' ')  
  13.  
  14.  
  15.     class Meta: 
  16.  
  17.         db_table = 'dept' 
  18.  
  19.         verbose_name = 'DEPT' 
  20.  
  21.         verbose_name_plural = 'DEPT' 
  22.  
  23.         ordering = ['deptno']  
  24.  
  25.  
  26.     def __unicode__(self): 
  27.  
  28.         return '%s %s' % (self.deptno, self.dname)  
  29.  
  30.  
  31. class dept(models.Model): 
  32.  
  33.     deptno = models.AutoField(primary_key=True) 
  34.  
  35.     dname = models.CharField(max_length=30) 
  36.  
  37.     loc = models.CharField(max_length=30, default=' ')  
  38.  
  39.  
  40.     class Meta: 
  41.  
  42.         db_table = 'dept' 
  43.  
  44.         verbose_name = 'DEPT' 
  45.  
  46.         verbose_name_plural = 'DEPT' 
  47.  
  48.         ordering = ['deptno']  
  49.  
  50.  
  51.     def __unicode__(self): 
  52.  
  53.         return '%s %s' % (self.deptno, self.dname)  
  54.  
  55.  
  56. class emp(models.Model): 
  57.  
  58.     empno = models.AutoField(primary_key=True) 
  59.  
  60.     ename = models.CharField(max_length=30) 
  61.  
  62.     job = models.CharField(max_length=30) 
  63.  
  64.     mgr = models.IntegerField() 
  65.  
  66.     hiredate = models.DateTimeField('hire date', default=timezone.now) 
  67.  
  68.     sal = models.IntegerField() 
  69.  
  70.     comm = models.IntegerField 
  71.  
  72.     deptno = models.ForeignKey('dept')  
  73.  
  74.  
  75.     class Meta: 
  76.  
  77.         db_table = 'emp' 
  78.  
  79.         verbose_name = 'EMP' 
  80.  
  81.         verbose_name_plural = 'EMP' 
  82.  
  83.         verbose_name_plural = 'EMP' 
  84.  
  85.         ordering = ['empno', 'ename']  
  86.  
  87.  
  88.     def __unicode__(self): 
  89.  
  90.         return '%s %s' % (self.empno, self.ename) 

其實(shí)內(nèi)容來看倒也不難,類型是通用的。

使用python manage.py makemigrations得到變化的結(jié)構(gòu)和數(shù)據(jù)

 
 
 
 
  1. Migrations for 'scott': 
  2.  
  3.   0001_initial.py: 
  4.  
  5.     - Create model dept 
  6.  
  7.     - Create model emp 

得到的SQL如下:

 
 
 
 
  1. >python manage.py sqlmigrate scott 0001 
  2.  
  3. BEGIN; 
  4.  
  5.     CREATE TABLE "dept" ("deptno" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "dname" varchar(30) NOT NULL, "loc" varchar(30) NOT NULL); 
  6.  
  7. CREATE TABLE "emp" ("empno" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "ename" varchar(30) NOT NULL, "job" varchar(30) NOT NULL, "mgr" integer NOT NULL 
  8.  
  9. , "hiredate" datetime NOT NULL, "sal" integer NOT NULL, "deptno_id" integer NOT NULL REFERENCES "dept" ("deptno")); 
  10.  
  11. CREATE INDEX "emp_d6b13549" ON "emp" ("deptno_id"); 
  12.  
  13. COMMIT; 

簡單確認(rèn)下,我們就可以生成創(chuàng)建出來這兩個表了,使用python manage.py migrate即可。

emp的表結(jié)構(gòu)如下:

dept的表結(jié)構(gòu)如下:

我們初始化一下數(shù)據(jù),這個時候直接使用SQL也可以.

dept表的初始化語句如下:

 
 
 
 
  1. insert into dept values(10,'ACCOUNTING','NEW YORK'); 
  2.  
  3. insert into dept values(20,'RESEARCH','DALLAS'); 
  4.  
  5. insert into dept values(30,'SALES','CHICAGO'); 
  6.  
  7. insert into dept values(40,'OPERATIONS','BOSTON'); 

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

 
 
 
 
  1. insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7369,'SMITH','CLERK',7902,'1980-12-17',800.00,20); 
  2.  
  3. insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7499,'ALLEN','SALESMAN',7698,'1981-2-20',1600.00,30); 
  4.  
  5. insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7521,'WARD','SALESMAN',7698,'1981-2-22',1250.00,30); 
  6.  
  7. insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7566,'JONES','MANAGER',7839,'1981-4-2',2975.00,20); 
  8.  
  9. insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7654,'MARTIN','SALESMAN',7698,'1981-9-28',1250.00,30); 
  10.  
  11. insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7698,'BLAKE','MANAGER',7839,'1981-5-1',2850.00,30); 
  12.  
  13. insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7782,'CLARK','MANAGER',7839,'1981-6-9',2450.00,10); 
  14.  
  15. insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7788,'SCOTT','ANALYST',7566,'1987--4-19',3000.00,20); 
  16.  
  17. insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7839,'KING','PRESIDENT',0,'1981-11-17',5000.00,10); 
  18.  
  19. insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7844,'TURNER','SALESMAN',7698,'1981-9-8',1500.00,30); 
  20.  
  21. insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7876,'ADAMS','CLERK',7788,'1987-5-23',1100.00,20); 
  22.  
  23. insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7900,'JAMES','CLERK',7698,'1981-12-3',950,30); 
  24.  
  25. insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7902,'FORD','ANALYST',7566,'1981-12-3',3000,20); 
  26.  
  27. insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO_ID) values(7934,'MILLER','CLERK',7782,'1982-1-23',1300,10); 
  28.  
  29. 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來看看ORM能否完成這個任務(wù)。

1、顯示所有的姓名、工種、工資和獎金,按工種降序排列,若工種相同則按工資升序排列。

如果使用MySQL,語句和數(shù)據(jù)結(jié)果如下:

 
 
 
 
  1. mysql> select ename,job,sal from emp order by job desc,sal asc; 
  2.  
  3. +----------+-----------+------+ 
  4.  
  5. | ename    | job       | sal  | 
  6.  
  7. +----------+-----------+------+ 
  8.  
  9. | WARD     | SALESMAN  | 1250 | 
  10.  
  11. | MARTIN   | SALESMAN  | 1250 | 

使用order_by的方式來處理,可以看到有了一點(diǎn)頭緒,但是還是沒有實(shí)現(xiàn)需求。

 
 
 
 
  1. >>> emp.objects.all().order_by('job') 
  2.  
  3. [, .... 

所以我們的重點(diǎn)就是排序了,ORM本身有order_by函數(shù),還可以調(diào)整DESC,ASC,所以一個基本符合要求的方式如下:

 
 
 
 
  1. >>> emp.objects.all().order_by(('-job'),('sal')) 
  2.  
  3. [ 

第二個題目也是類似的。

2、查詢員工的姓名和入職日期,并按入職日期從先到后進(jìn)行排列。

SQL語句如下:

 
 
 
 
  1. select ename,hiredate from emp order by hiredate asc; 

現(xiàn)在的語句如下:

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

3. 計(jì)算工資***的員工

這個需求充分考慮到聚合函數(shù)的部分,我們可以使用aggregate來完成這個工作。

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

4.查詢至少有一個員工的部門信息。  

這個部分會涉及到表關(guān)聯(lián)關(guān)系,如果是通過SQL的方式,語句如下:

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

執(zhí)行的結(jié)果如下,可以看到***種方式能出結(jié)果,但是還是存在重復(fù)值,需要用distinct過啦一下。

 
 
 
 
  1. >>> dept.objects.filter(emp__mgr__isnull=False) 
  2.  
  3. [
  4.  
  5. >>> dept.objects.filter(emp__mgr__isnull=False).distinct() 
  6.  
  7. [
  8.  
  9. >>>  

后續(xù)繼續(xù)補(bǔ)充ORM的內(nèi)容。


本文標(biāo)題:使用Oracle中的emp、dept來學(xué)習(xí)Django ORM
新聞來源:http://m.5511xx.com/article/cdipddp.html