MVC或者MVC框架中包括一個重要的部分,就是ORM,它實現了數據模型與數據庫的解耦,即數據模型的設計不須要依賴於特定的數據庫,經過簡單的配置就能夠輕鬆更換數據庫,這極大的減輕了開發人員的工做量,不須要面對因數據庫變動而致使的無效勞動
ORM是「對象-關係-映射」的簡稱。前端
SQL語句:python
#sql中的表 #建立表: CREATE TABLE employee( id INT PRIMARY KEY auto_increment , name VARCHAR (20), gender BIT default 1, birthday DATA , department VARCHAR (20), salary DECIMAL (8,2) unsigned, ); #sql中的表紀錄 #添加一條表紀錄: INSERT employee (name,gender,birthday,salary,department) VALUES ("alex",1,"1985-12-12",8000,"保潔部"); #查詢一條表紀錄: SELECT * FROM employee WHERE age=24; #更新一條表紀錄: UPDATE employee SET birthday="1989-10-24" WHERE id=1; #刪除一條表紀錄: DELETE FROM employee WHERE name="alex"
django語句:mysql
#python的類
class Employee(models.Model): id=models.AutoField(primary_key=True) name=models.CharField(max_length=32) gender=models.BooleanField() birthday=models.DateField() department=models.CharField(max_length=32) salary=models.DecimalField(max_digits=8,decimal_places=2) #python的類對象
#添加一條表紀錄:
emp=Employee(name="alex",gender=True,birthday="1985-12-12",epartment="保潔部") emp.save() #查詢一條表紀錄:
Employee.objects.filter(age=24) #更新一條表紀錄:
Employee.objects.filter(id=1).update(birthday="1989-10-24") #刪除一條表紀錄:
Employee.objects.filter(name="alex").delete()
建立名爲book的app,在book下的models.py中建立模型:git
1 from django.db import models 2 # Create your models here.
3
4 class Book(models.Model): 5 id=models.AutoField(primary_key=True) 6 title=models.CharField(max_length=32) 7 state=models.BooleanField() 8 pub_date=models.DateField() 9 price=models.DecimalField(max_digits=8,decimal_places=2) 10 publish=models.CharField(max_length=32)
每一個字段有一些特有的參數,例如,CharField須要max_length參數來指定VARCHAR數據庫字段的大小。還有一些適用於全部字段的通用參數。 這些參數在文檔中有詳細定義,這裏咱們只簡單介紹一些最經常使用的:sql
更多字段:數據庫
1 類型 說明 2 AutoField 一個自動增長的整數類型字段。一般你不須要本身編寫它,Django會自動幫你添加字段:id = models.AutoField(primary_key=True),這是一個自增字段,從1開始計數。若是你非要本身設置主鍵,那麼請務必將字段設置爲primary_key=True。Django在一個模型中只容許有一個自增字段,而且該字段必須爲主鍵! 3 BigAutoField (1.10新增)64位整數類型自增字段,數字範圍更大,從1到9223372036854775807 4 BigIntegerField 64位整數字段(看清楚,非自增),相似IntegerField ,-9223372036854775808 到9223372036854775807。在Django的模板表單裏體現爲一個textinput標籤。 5 BinaryField 二進制數據類型。使用受限,少用。 6 BooleanField 布爾值類型。默認值是None。在HTML表單中體現爲CheckboxInput標籤。若是要接收null值,請使用NullBooleanField。 7 CharField 字符串類型。必須接收一個max_length參數,表示字符串長度不能超過該值。默認的表單標籤是input text。最經常使用的filed,沒有之一! 8 CommaSeparatedIntegerField 逗號分隔的整數類型。必須接收一個max_length參數。經常使用於表示較大的金額數目,例如1,000,000元。 9 DateField class DateField(auto_now=False, auto_now_add=False, **options)日期類型。一個Python中的datetime.date的實例。在HTML中表現爲TextInput標籤。在admin後臺中,Django會幫你自動添加一個JS的日曆表和一個「Today」快捷方式,以及附加的日期合法性驗證。兩個重要參數:(參數互斥,不能共存) auto_now:每當對象被保存時將字段設爲當前日期,經常使用於保存最後修改時間。auto_now_add:每當對象被建立時,設爲當前日期,經常使用於保存建立日期(注意,它是不可修改的)。設置上面兩個參數就至關於給field添加了editable=False和blank=True屬性。若是想具備修改屬性,請用default參數。例子:pub_time = models.DateField(auto_now_add=True),自動添加發布時間。 10 DateTimeField 日期時間類型。Python的datetime.datetime的實例。與DateField相比就是多了小時、分和秒的顯示,其它功能、參數、用法、默認值等等都同樣。 11 DecimalField 固定精度的十進制小數。至關於Python的Decimal實例,必須提供兩個指定的參數!參數max_digits:最大的位數,必須大於或等於小數點位數 。decimal_places:小數點位數,精度。 當localize=False時,它在HTML表現爲NumberInput標籤,不然是text類型。例子:儲存最大不超過999,帶有2位小數位精度的數,定義以下:models.DecimalField(..., max_digits=5, decimal_places=2)。 12 DurationField 持續時間類型。存儲必定期間的時間長度。相似Python中的timedelta。在不一樣的數據庫實現中有不一樣的表示方法。經常使用於進行時間之間的加減運算。可是當心了,這裏有坑,PostgreSQL等數據庫之間有兼容性問題! 13 EmailField 郵箱類型,默認max_length最大長度254位。使用這個字段的好處是,可使用DJango內置的EmailValidator進行郵箱地址合法性驗證。 14 FileField class FileField(upload_to=None, max_length=100, **options)上傳文件類型,後面單獨介紹。 15 FilePathField 文件路徑類型,後面單獨介紹 16 FloatField 浮點數類型,參考整數類型 17 ImageField 圖像類型,後面單獨介紹。 18 IntegerField 整數類型,最經常使用的字段之一。取值範圍-2147483648到2147483647。在HTML中表現爲NumberInput標籤。 19 GenericIPAddressField class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)[source],IPV4或者IPV6地址,字符串形式,例如192.0.2.30或者2a02:42fe::4在HTML中表現爲TextInput標籤。參數protocol默認值爲‘both’,可選‘IPv4’或者‘IPv6’,表示你的IP地址類型。 20 NullBooleanField 相似布爾字段,只不過額外容許NULL做爲選項之一。 21 PositiveIntegerField 正整數字段,包含0,最大2147483647。 22 PositiveSmallIntegerField 較小的正整數字段,從0到32767。 23 SlugField slug是一個新聞行業的術語。一個slug就是一個某種東西的簡短標籤,包含字母、數字、下劃線或者鏈接線,一般用於URLs中。能夠設置max_length參數,默認爲50。 24 SmallIntegerField 小整數,包含-32768到32767。 25 TextField 大量文本內容,在HTML中表現爲Textarea標籤,最經常使用的字段類型之一!若是你爲它設置一個max_length參數,那麼在前端頁面中會受到輸入字符數量限制,然而在模型和數據庫層面卻不受影響。只有CharField才能同時做用於二者。 26 TimeField 時間字段,Python中datetime.time的實例。接收同DateField同樣的參數,只做用於小時、分和秒。 27 URLField 一個用於保存URL地址的字符串類型,默認最大長度200。 28 UUIDField 用於保存通用惟一識別碼(Universally Unique Identifier)的字段。使用Python的UUID類。在PostgreSQL數據庫中保存爲uuid類型,其它數據庫中爲char(32)。這個字段是自增主鍵的最佳替代品,後面有例子展現。
相關參數:django
(1)null 若是爲True,Django 將用NULL 來在數據庫中存儲空值。 默認值是 False. (1)blank 若是爲True,該字段容許不填。默認爲False。 要注意,這與 null 不一樣。null純粹是數據庫範疇的,而 blank 是數據驗證範疇的。 若是一個字段的blank=True,表單的驗證將容許該字段是空值。若是字段的blank=False,該字段就是必填的。 (2)default 字段的默認值。能夠是一個值或者可調用對象。若是可調用 ,每有新對象被建立它都會被調用。 (3)primary_key 若是爲True,那麼這個字段就是模型的主鍵。若是你沒有指定任何一個字段的primary_key=True, Django 就會自動添加一個IntegerField字段作爲主鍵,因此除非你想覆蓋默認的主鍵行爲, 不然不必設置任何一個字段的primary_key=True。 (4)unique 若是該值設置爲 True, 這個數據字段的值在整張表中必須是惟一的 (5)choices 由二元組組成的一個可迭代對象(例如,列表或元組),用來給字段提供選擇項。 若是設置了choices ,默認的表單將是一個選擇框而不是標準的文本框,<br>並且這個選擇框的選項就是choices 中的選項。
若想將模型轉爲mysql數據庫中的表,須要在settings中配置:app
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'bms', # 要鏈接的數據庫,鏈接前須要建立好
'USER':'root', # 鏈接數據庫的用戶名
'PASSWORD':'', # 鏈接數據庫的密碼
'HOST':'127.0.0.1', # 鏈接主機,默認本級
'PORT':3306 # 端口 默認3306
} }
注意1:NAME即數據庫的名字,在mysql鏈接前該數據庫必須已經建立,而上面的sqlite數據庫下的db.sqlite3則是項目自動建立 USER和PASSWORD分別是數據庫的用戶名和密碼。設置完後,再啓動咱們的Django項目前,咱們須要激活咱們的mysql。而後,啓動項目,會報錯:no module named MySQLdb 。這是由於django默認你導入的驅動是MySQLdb,但是MySQLdb 對於py3有很大問題,因此咱們須要的驅動是PyMySQL 因此,咱們只須要找到項目名文件下的init,在裏面寫入:框架
import pymysql pymysql.install_as_MySQLdb()
最後經過兩條數據庫遷移命令便可在指定的數據庫中建立表 ide
python manage.py makemigrations
python manage.py migrate
注意: 若是想打印orm轉換過程當中的sql,須要在settings中進行以下配置:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
方式1
# create方法的返回值book_obj就是插入book表中的python葵花寶典這本書籍紀錄對象
book_obj=Book.objects.create(title="python葵花寶典",state=True,price=100,publish="蘋果出版社",pub_date="2012-12-12")
方式2
book_obj=Book(title="python葵花寶典",state=True,price=100,publish="蘋果出版社",pub_date="2012-12-12") book_obj.save()
查詢API
<1> all(): 查詢全部結果 <2> filter(**kwargs): 它包含了與所給篩選條件相匹配的對象 <3> get(**kwargs): 返回與所給篩選條件相匹配的對象,返回結果有且只有一個, 若是符合篩選條件的對象超過一個或者沒有都會拋出錯誤。 <4> exclude(**kwargs): 它包含了與所給篩選條件不匹配的對象 <5> order_by(*field): 對查詢結果排序 <6> reverse(): 對查詢結果反向排序 <8> count(): 返回數據庫中匹配查詢(QuerySet)的對象數量。 <9> first(): 返回第一條記錄 <10> last(): 返回最後一條記錄 <11> exists(): 若是QuerySet包含數據,就返回True,不然返回False <12> values(*field): 返回一個ValueQuerySet——一個特殊的QuerySet,運行後獲得的並非一系列 model的實例化對象,而是一個可迭代的字典序列 <13> values_list(*field): 它與values()很是類似,它返回的是一個元組序列,values返回的是一個字典序列 <14> distinct(): 從返回結果中剔除重複紀錄
基於雙下劃線的模糊查詢
Book.objects.filter(price__in=[100,200,300]) Book.objects.filter(price__gt=100) Book.objects.filter(price__lt=100) Book.objects.filter(price__range=[100,200]) Book.objects.filter(title__contains="python") Book.objects.filter(title__icontains="python") Book.objects.filter(title__startswith="py") Book.objects.filter(pub_date__year=2012)
刪除方法就是 delete()。它運行時當即刪除對象而不返回任何值。例如:
model_obj.delete()
你也能夠一次性刪除多個對象。每一個 QuerySet 都有一個 delete() 方法,它一次性刪除 QuerySet 中全部的對象。
例如,下面的代碼將刪除 pub_date 是2005年的 Entry 對象:
Entry.objects.filter(pub_date__year=2005).delete()
在 Django 刪除對象時,會模仿 SQL 約束 ON DELETE CASCADE 的行爲,換句話說,刪除一個對象時也會刪除與它相關聯的外鍵對象。例如:
b = Blog.objects.get(pk=1) # This will delete the Blog and all of its Entry objects.
b.delete()
要注意的是: delete() 方法是 QuerySet 上的方法,但並不適用於 Manager 自己。這是一種保護機制,是爲了不意外地調用 Entry.objects.delete() 方法致使 全部的 記錄被誤刪除。若是你確認要刪除全部的對象,那麼你必須顯式地調用:
Entry.objects.all().delete()
若是不想級聯刪除,能夠設置爲:
pubHouse = models.ForeignKey(to='Publisher', on_delete=models.SET_NULL, blank=True, null=True)
Book.objects.filter(title__startswith="py").update(price=120)
此外,update()方法對於任何結果集(QuerySet)均有效,這意味着你能夠同時更新多條記錄update()方法會返回一個整型數值,表示受影響的記錄條數。
1 圖書管理系統 實現功能:book單表的增刪改查 2 查詢操做練習
1 查詢老男孩出版社出版過的價格大於200的書籍 2 查詢2017年8月出版的全部以py開頭的書籍名稱 3 查詢價格爲50,100或者150的全部書籍名稱及其出版社名稱 4 查詢價格在100到200之間的全部書籍名稱及其價格 5 查詢全部人民出版社出版的書籍的價格(從高到低排序,去重)
1 # 1 查詢老男孩出版社出版過的價格大於200的書籍 2 # book_list = Book.objects.filter(publish='老男孩出版社', price__gt=200).all().values('title') 3 # 2 查詢2017年8月出版的全部以py開頭的書籍名稱 4 # book_list = Book.objects.filter(pub_date__year=2017,pub_date__month=8,title__startswith='py').all().values('title') 5 # 3 查詢價格爲50,100或者150的全部書籍名稱及其出版社名稱 6 # book_list = Book.objects.filter(price__in=(50, 100, 150)).all().values_list('title','publish') 7 8 # 4 查詢價格在100到200之間的全部書籍名稱及其價格 9 # book_list = Book.objects.filter(price__range=(100,200)).all().values_list('title','price') 10 11 # 5 查詢全部人民出版社出版的書籍的價格(從高到低排序,去重) 12 book_list = Book.objects.filter(publish='人民出版社').all().values_list('title','price').distinct()