這篇博客會簡單介紹 ORM 的觀念,以及用 ORM 來 增、查、刪、改 資料庫表
ORM 概念
它是透過 Python 中的物件導向生成實例對象來操作資料庫的表(Table) 有了這個實例對象我們就可以對資料庫中的紀錄進行操作囉 !
有人會說用 SQL 就好啦幹嘛還要用 ORM ? 不過大家想想為什麼會有 ORM 的出現呢 ? 雖然說 ORM 不是必需的,但必須得用 ! ! 除非你 SQL 很熟練 ! (堅持要用的那種~
因為相對於 SQL 來說 ORM 語句用起來更靈活、簡單 ! 二來就是 ORM 在資料庫搬遷這部分是非常容易的喔~
假如你是用MySQL的語法寫,有天你要更換資料庫,那就意味著有些SQL語句不適用了,沒辦法完全搬遷,那這樣就麻煩了還要重新設計 ! But, ORM不是萬能的,假如一碰到複雜的情況(查詢),還是用SQL來的好(性能)
了解了觀念之後接下來開始,建立 一對多(foreign key relationship) 的數據模型
book / models.py
# 作者 class Author(models.Model): id = models.AutoField(primary_key=True) name = models.CharField('作者', max_length=30, default='') email = models.EmailField() def __str__(self): return self.name class Meta: db_table = 'tb_author' # 書 class Book(models.Model): author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='book') book_name = models.CharField('書名', max_length=50, default='') price = models.DecimalField('TWD$', max_digits=4, decimal_places=0) def __str__(self): return self.book_name class Meta: db_table = 'tb_book'在 Django console 中操作。
新增一筆資料
a = Author.objects.create(name='大頭菜', email='aa123@gmail.com')這裡的 a 就是個實例對象。去看看資料庫 !
tb_author 接下來新增 tb_book 去看看資料庫 ! 實例對象的用途就在這 ! ! !
a.book.create(book_name='Java程式設計:從入門到放棄', price=999)tb_book
這裡大家可能會有點疑問 ? 為什麼會有 author_id ,它其實是外鍵 (FK),它對應到的是 tb_author 的 主鍵 id (PK)。兩張表就是靠 author_id 來關聯的 ! ! !
大家會不會覺得說。這樣資料一筆一筆新增太慢了,根本沒效率(方便性),那你們有想到要怎麼解決嗎 ? 想到了嗎? 封裝一個函數 !
Django Console
def insert_data(): data = {'蒂芬妮':'Tiffany@gmail.com', '莉莉安':'Lilian@gmail.com', '阿二':'Aji@gmail.com'} for k, v in data.items(): Author.objects.create(name=k, email=v) insert_data()tb_author 成功新增三筆資料!
Dango Console
def insert_tb_book(): a1 = Author.objects.get(id=2) data = {'線性代數':890, '微積分':560, '統計學':1000} for k, v in data.items(): a1.book.create(book_name=k, price=v) insert_tb_book()tb_book 一樣的操作 ! 阿…剛剛我們資料輸入錯了 ! 作者 : 大頭菜的JAVA程式設計:從入門到放棄,書本定價應該是778元,我們要怎麼修改呢 ?
應該是要先找到作者, 然後再去找他的書,找到之後 ~ 更新它的價錢 !
a = Author.objects.get(name='大頭菜') a.book.filter(book_name='Java程式設計:從入門到放棄').update(price=778)tb_book
現在我們要刪掉微積分這本書, 因為作者: 蒂芬妮抄襲,被迫下架了 ! 其實操作方式都一樣只是 update 換成 delete 而已,就這樣很簡單
a = Author.objects.get(name='蒂芬妮') a.book.filter(book_name='微積分').delete()這樣就把它下架了 !
在做下個操作前,我們要對 models.py 做一些更動,要 加上書的編號
class Book(models.Model): author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='book') book_id = models.PositiveIntegerField('編號', default=10001) book_name = models.CharField('書名', max_length=50, default='') price = models.DecimalField('(TWD$)', max_digits=4, decimal_places=0) def __str__(self): return '編號:{} 作者:{} 書名:{} 價錢:{}'.format(self.book_id, self.author.name, self.book_name, self.price)tb_book 是不是發現,我跟你的資料不一樣呀,出個小練習,把資料表變得跟我一樣,剛剛學的就足以操作了 ! ! ! 完成之後,繼續接下來內容囉 ~
咦 ! 最近有點想學人工智慧 (AI), 聽說要學 線性代數, 那我去買一本好了。可是我的預算只有 700 元, 去找找看有沒有好了。 要怎麼寫呢 ?
這段代碼的意思是 從Book中 搜尋線性代數 這本書,然後再找價錢低於 700 元 的書 ! 你看有兩本線性代數,符合你的需求。 有一點要記 get()返回的是一个對象 filter()返回的是由對象组成的列表,稱為 QuerySet 集合 ! 這裡我也是簡略帶過,之後會有更詳細的介紹 !
Book.objects.filter(book_name='線性代數').filter(price__lte=700) <QuerySet [<Book: 編號:10004 作者:莉莉安 書名:線性代數 價錢:666>, <Book: 編號:10005 作者:阿二 書名:線性代數 價錢:590>]>接下來要介紹
正向查詢 透過作者,找尋書本 !
蒂芬妮出了哪幾本書 !
a = Author.objects.get(name='蒂芬妮') a.book.all() <QuerySet [<Book: 編號:10002 作者:蒂芬妮 書名:線性代數 價錢:890>, <Book: 編號:10003 作者:蒂芬妮 書名:統計學 價錢:1000>]>逆向查詢 透過書本,找尋作者 !
誰是這本JAVA程式設計:從入門到放棄的作者 !
b = Book.objects.get(book_name='Java程式設計:從入門到放棄') b.author.name '大頭菜'很簡單吧 !
下一篇文章見囉 ~ ~ ~