国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

使用Oracle中的emp、dept來學習Django ORM

開發 后端 Oracle
學習Django的時候,總是覺得這部分內容和實際的應用有一定的差別或者距離。一方面Django自帶的ORM對于底層數據庫來說是一種適配性很強的組件,可以不強依賴于某一種數據庫,sqlite,MySQL,Oracle,PG等等都可以,學習起來需要一定的周期。

使用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的文件中配置即可。

 

  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) 

 

其實內容來看倒也不難,類型是通用的。

使用python manage.py makemigrations得到變化的結構和數據

 

  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

 

簡單確認下,我們就可以生成創建出來這兩個表了,使用python manage.py migrate即可。

emp的表結構如下:

dept的表結構如下:

我們初始化一下數據,這個時候直接使用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); 

剩下的事情就是實踐了。我們就選擇emp,dept常見的一些SQL來看看ORM能否完成這個任務。

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

如果使用MySQL,語句和數據結果如下:

 

  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的方式來處理,可以看到有了一點頭緒,但是還是沒有實現需求。

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

 

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

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

 

第二個題目也是類似的。

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

SQL語句如下:

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

現在的語句如下:

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

3. 計算工資***的員工

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

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

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

這個部分會涉及到表關聯關系,如果是通過SQL的方式,語句如下:

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

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

 

  1. >>> dept.objects.filter(emp__mgr__isnull=False
  2.  
  3. [<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>] 
  4.  
  5. >>> dept.objects.filter(emp__mgr__isnull=False).distinct() 
  6.  
  7. [<dept: 10 ACCOUNTING>, <dept: 20 RESEARCH>, <dept: 30 SALES>] 
  8.  
  9. >>>  

 

后續繼續補充ORM的內容。 

責任編輯:龐桂玉 來源: 楊建榮的學習筆記
相關推薦

2010-08-09 13:37:09

FlexDjango

2010-02-01 10:30:13

Python世界

2020-12-03 09:01:29

Django

2010-04-29 12:13:53

Oracle使用alt

2010-04-14 09:54:56

Oracle數據庫

2023-11-03 08:28:19

2022-03-07 16:30:10

數據庫ORM開發人員

2019-05-20 15:08:07

PythonPyPI庫attrs

2023-02-03 11:40:49

機器學習分析情感

2010-04-08 14:23:14

Oracle服務

2011-04-08 15:50:54

Oracleover函數

2010-11-18 16:18:23

EXECUTE IMM

2017-07-19 16:02:27

Python數據科學數據分析

2018-06-14 14:05:48

機器學習大數據卡通上色

2011-06-27 13:19:36

OMF托管文件ASM

2009-04-30 09:45:03

Oracle索引限制

2020-03-26 10:43:57

CSS Grid Ge Grid代碼

2010-04-26 14:03:02

Oracle使用

2021-04-09 06:15:54

開源工具Python編程語言

2011-08-01 15:57:58

點贊
收藏

51CTO技術棧公眾號

欧洲av一区二区嗯嗯嗯啊| 精品国产乱码久久久久久天美| 99re在线国产| 成人系列视频| 91视频国产一区| 好看的亚洲午夜视频在线| 成人片在线免费看| 欧美成人激情| www.久久爱.cn| 在线观看日韩av电影| 国产精品区二区三区日本| 蜜乳av一区二区三区| 五月天综合网| 99久久精品国产毛片| 一本岛在线视频| 色综合久久久久综合体| av播放在线| 国产视频自拍一区| 亚洲精品蜜桃乱晃| 91亚洲一区精品| 清纯唯美日韩| 中国成人在线视频| 日本一区二区综合亚洲| 免费高清在线| 一区二区三区www| 色婷婷亚洲mv天堂mv在影片| 日本高清久久一区二区三区| 国产精品午夜春色av| 一个人看的免费网站www视频| 日韩欧美国产一区二区| 91精品国产色综合久久不卡粉嫩| 日韩av免费在线观看| 最新国产精品| 97视频久久久| 亚洲日本一区二区三区| 在线观看av网站| …久久精品99久久香蕉国产| 宅男噜噜噜66国产日韩在线观看| 天天色综合6| 亚洲一区二区三区在线| 国内激情视频在线观看| www久久99| 午夜不卡在线视频| 日韩护士脚交太爽了| 久久精品无码一区二区三区| 亚洲综合色在线观看| 亚洲成人1234| 欧美xxav| 黄色三及免费看| 性亚洲最疯狂xxxx高清| 久久久噜噜噜久噜久久综合| 91久久青草| 免费观看精品视频| 色婷婷av一区二区三区在线观看 | 国产精品久久91| 日本欧美一区二区三区乱码| 国产精品专区免费| 久久久亚洲综合网站| 欧美色视频日本高清在线观看| 亚洲国产高清视频| 偷拍精品精品一区二区三区| www.色偷偷.com| 国产精品欧美亚洲777777| 午夜国产不卡在线观看视频| 久久一区二区三区电影| 川上优的av在线一区二区| 精品国产乱码久久久久久久软件| 国产丝袜高跟一区| 国产女人aaa级久久久级 | 超碰97人人在线| 伊人久久精品视频| 久久综合色鬼综合色| 尤物yw193can在线观看| 国产精品欧美久久| 中文字幕日本精品| 色哟哟精品一区| 91蝌蚪porny| 亚洲尤物精选| 精品国产a一区二区三区v免费| 欧美草逼视频| 久久久精品国产网站| 粉嫩av亚洲一区二区图片| 性欧美freesex顶级少妇| 麻豆传媒视频在线| 国产精品久久网| 久久中文字幕一区二区三区| 国产精品久久久久久免费观看| 香蕉亚洲视频| 91av一区| 欧美aaa在线观看| 欧美亚洲成人网| 日韩你懂的电影在线观看| 不卡欧美aaaaa| 欧美日本免费| 黄色亚洲网站| 日本www在线| 欧美一级久久久久久久大片| 欧美xxxx少妇| 成人免费播放器| 成人写真福利网| 少妇高潮久久77777| 亚洲精品视频免费观看| 国产成人在线观看免费网站| 亚洲不卡系列| 亚洲成人影院麻豆| av网站观看| 中国老女人av| 日韩免费在线免费观看| 五月天激情小说综合| 久久夜色电影| 欧美一级免费| 亚洲欧洲自拍| 欧美jizzhd69巨大| 偷拍盗摄高潮叫床对白清晰| 96国产粉嫩美女| 一区二区中文字幕| 日韩欧美另类中文字幕| 日本欧洲一区| 免费成人看片| 东北一级毛片| 久久国产成人精品国产成人亚洲| 免费观看国产成人| 91精品国产高清久久久久久91裸体| 久久久伊人欧美| 97色在线视频| 久久久亚洲国产天美传媒修理工| 久久91精品国产91久久跳| 日韩五码电影| 亚洲人高潮女人毛茸茸| 美女视频免费精品| 国产网红在线观看| 久久精品国产福利| 成人午夜888| 伊人色综合一区二区三区影院视频| 一级片在线免费看| 国产又大又黄又粗又爽| 又色又爽又高潮免费视频国产| 黄网免费入口| 蜜桃av在线免费观看| av影片在线| 成人直播大秀| 日韩精品1区| 都市激情综合| 91精品国产色综合久久不卡98口 | 国产日韩欧美综合在线| 国产欧美高清视频在线| 美女日韩欧美| 国产在线一区不卡| 日韩久久精品| 成人偷拍自拍| 天天综合国产| 日韩精品欧美精品| 国产精品综合久久| 欧美高清在线精品一区| 成人免费福利| 欧美日韩国产综合网| 国产精品视频在线看| 亚洲第一中文字幕| 欧美国产精品va在线观看| 日本韩国欧美精品大片卡二| 久久久久北条麻妃免费看| 欧美肥臀大乳一区二区免费视频| 日韩久久午夜影院| 色爱av美腿丝袜综合粉嫩av| 国产精品99蜜臀久久不卡二区| 国产精品99久久久久久久久| 久久伊人精品一区二区三区| 亚洲免费视频网站| 日韩有码在线视频| 亚洲精品影院| 三年中国国语在线播放免费| 久草在线新视觉| 久久久久伊人| 成人一级视频在线观看| 亚洲超碰精品一区二区| 国产精品久久久久久久一区探花 | 亚洲图片欧美色图| 日韩专区在线观看| 蜜桃在线一区二区三区精品| 五月婷婷激情久久| 成人免费激情视频| 91aaaa| 高清中文字幕在线| 激情网站在线| 亚洲深夜福利在线观看| 成人高清在线视频| 制服丝袜成人动漫| 午夜精品久久久久久久99热 | 国产精品视频免费看| 天天色天天爱天天射综合| 亚洲а∨天堂久久精品9966| 91精品国产99| 免费看成一片| 国产精品久久久久久影院8一贰佰| 国产成人综合亚洲91猫咪| 亚洲激情久久久| 亚洲一区二区自拍| 午夜激情在线观看| 91麻豆精品| 国产精品资源|