1. 程式人生 > 資料庫 >最全得django講解,零基礎從入門到精通 (No.3---與資料庫互動)

最全得django講解,零基礎從入門到精通 (No.3---與資料庫互動)

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理

以下文章來源於騰訊雲 作者:Python進階者

( 想要學習Python?Python學習交流群:1039649593,滿足你的需求,資料都已經上傳群檔案流,可以自行下載!還有海量最新2020python學習資料。 )
在這裡插入圖片描述

一、前言

之前我們學到了模型的概念,提到了關聯關係以及一些欄位,現在我們來對這些知識進行擴充並且應用,那麼就需要與資料庫進行互動才能實現了。

二、與資料庫建立連線

前面我們講過django的模型和關聯關係後,我們來試著操縱下資料庫,首先我們需要在django中配置資料庫,進入settings.py檔案中,如下:

在這裡插入圖片描述
這裡我們可以設定四種資料庫型別,如下:

'django.db.backends.postgresql'
'django.db.backends.mysql'
'django.db.backends.sqlite3'
'django.db.backends.oracle'

 

除此之外,databases還有其它的內部選項,如下:

ATOMIC_REQUESTS:為True時資料庫事務包裝每個檢視,預設為False
AUTOCOMMIT:為False時禁用Django事務管理,預設為True
HOST:指定連線的主機名或ip地址,如果使用(‘/’)正斜槓開頭則通過套接字連線
CONN_MAX_AGE:資料庫連線的生命週期,預設為0請求結束時關閉資料庫,設定為None無限持久連線
OPTIONS:連結到資料庫時使用的額外引數,可用引數因資料庫型別而異。
'OPTIONS':{'read_default_file':'add/my.conf',} #優先於NAME,USER,PASSWORD,HOST,PORT
#設定mysql啟用嚴格模式
'OPTIONS':{'init_command':"SET sql_mode='STRICT_TRANS_TABLES'"}
PASSWORD:設定密碼,不與SQLite一起使用
PORT:指定埠
TIME_ZONE:設定時區
DISABLE_SERVER_SIDE_CURSORS:True時禁用伺服器端遊標
USER:連結使用者名稱
TEST:測試資料庫

 

如果我們想配置一個MySQL資料庫,如下:

‘db1’:{
‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: ‘db1’,
‘USER’: ‘root’,
‘PASSWORD’: ‘123456’,
‘HOST’: ‘127.0.0.1’,
‘PORT’: ‘3306’,
‘OPTIONS’: {
‘init_command’: “SET sql_mode=‘STRICT_TRANS_TABLES’”,
}, #mysql使用嚴格模式,不指定會有警告資訊

 

配置好了之後,我們需要使用pymysql模組來使資料庫連線上,只需在該目錄的init.py檔案中新增如下程式碼即可:

import pymysql
pymysql.install_as_MySQLdb()

 

下面分別是postgresql和oracle的配置方法,如下:

    'db2':{
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'db2',
        'USER': 'xxxxxx',
        'PASSWORD': 'xxxxx'
    }
​
​
        'db3':{
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'db3',
        'USER': 'xxxxxxx',
        'PASSWORD': 'xxxxxxx',
        'HOST': '',
        'PORT': '',
    }

 

三、生成遷移檔案

所有的配置設定好了之後,我們就可以通過遷移命令生成一個檔案,如下:
在這裡插入圖片描述
該檔案包含了我們建立的關係表的結構,它將應用同步到指定的資料庫中。

四、遷移資訊同步到資料庫

由於我們沒指定,因此會儲存到預設的sqlite3資料庫中,如果想把它儲存到MySQL資料庫中,很簡單,如下:

python manage.py migrate --database=db1

 

直接指定資料庫即可。

五、匯出資料

如果我們要匯出資料庫的內容也很簡單,如下:

python manage.py dumpdata he >1.json #儲存單個數據庫的資料
python manage.py dumpdata auth >1.json#儲存所有資料庫的資料

 

六、匯入資料

有匯出勢必有匯入,如下:

python manage.py loaddata app1_fixture.json --database=db1

 

接下來我們將這些資訊儲存到資料庫中,如圖:
在這裡插入圖片描述
這樣就把我們剛剛配置好的關聯表的資訊輸入到了sqlite3資料庫中去了,這個時候我們可以對模型中的類進行操作了。

七、操作資料庫

我們可以在cmd視窗中來實現資料庫的基本操作,如圖:
在這裡插入圖片描述

如果你不習慣在cmd中操作,也可以把程式碼寫在app的views.py檔案中,如下:

然後把這個檢視函式新增到urls.py檔案中,如圖:

在這裡插入圖片描述
在這裡插入圖片描述
可以看到,我們已經輸出了結果,只是目前我們沒有往資料庫中插入任何資料,因此沒有任何值。首先我們來看看我們編寫的資料模型類,如下:

from django.db import models
from django.utils import timezone
# Create your models here.
class book(models.Model):
    id=models.AutoField(primary_key=True)
    book_name=models.CharField(max_length=30)
    book_price=models.IntegerField()
class title(models.Model):
    start=models.DateTimeField(default=timezone.now)
    end=models.DateTimeField(auto_now=True)
    bk=models.ForeignKey(book,on_delete=models.CASCADE)
class people(models.Model):
    article=models.CharField(max_length=20)
    age=models.IntegerField()
    p=models.ManyToManyField(book)
    t=models.OneToOneField(title,on_delete=models.CASCADE)

 

可以看到,我們這裡設定了多種關聯關係,比如一對多,多對多,一對一,這樣可以更方便大家理解。

1.增加

如果我們要進行資料庫的增加操作,我們需要先行建立一個類物件,也就是我們的模型,這裡有四種方法可選,如下:

1.book.objects.create(book_name='fds',book_price=43)

2.b=book(book_name='fds',book_price=43)
  b.save()#儲存

3.b=book(book_name='fds')
b.book_price=43
b.save()

4.book.objects.get_or_create(book_name='fds',book_price=43)防止重複

 

在這裡插入圖片描述

2.查詢

有了物件後我們就需要獲取這些物件的值了,如下:

1.book.objects.all()
2.book.objects.all()[:3] #獲取3本書的資訊,不支援負索引,可以節約記憶體
book.objects.all().reverse()[:2] #最後兩本書
3.book.objects.get(book_name='西遊記')#獲取書名為西遊記的資訊
4.book.objects.filter(book_name='紅樓夢')##過濾書名為西遊記的資訊
book.objects.filter(id__lt=6,id__gt=1)#獲取id大於1且小於6的值
book.objects.filter(id__in=[1,2,3]) #獲取id等於1,2,3的資料
book.objects.filter(id__range=[1,5]) #獲取id為1~5之間的資料
book.objects.filter(book_name__icontains='aaa')#包含aaa,且aaa不區分大小寫
book.objects.filter(book_name__iexact='aaa')#為aaa,但是不區分大小寫
5.book.objects.exclude(book_name='水滸傳')#去除書名為西遊記的其它資訊

 

3.刪除

刪除操作非常簡便,只需要我們先選好物件,然後進行刪除即可,如下:

book.objects.filter(book_name='水滸傳').delete()

 

4.更新

和刪除操作一樣簡便,如下:

book.objects.filter(book_name='紅樓夢').update(book_price=100)

 

也可以通過get函式獲取指定條件的物件然後修改單條資料,如下:

b=book.objects.get(book_name='紅樓夢')
b.book_price=299
b.save()

 

這樣做的好處是更加靈活。如圖:
在這裡插入圖片描述
5.獲取個數和對應的值
如果我們想獲取某個滿足條件的物件的個數或者值的話,很簡單,如下:

book.objects.filter(book_name='紅樓夢').count()#個數
 book.objects.filter(book_price=321).values('id') #id的值

 

在這裡插入圖片描述

6.排序分組

有時候我們需要給資料進行排序後再輸出,這裡使用一個函式即可搞定,如下:

book.objects.filter(book_name='紅樓夢').order_by('id') #升序排序
book.objects.filter(book_name='紅樓夢').order_by('-id') #降序排序

 

如果我們想把結果進行分組,也是一個函式就搞定,如下:

book.objects.filter(book_name='水滸傳').values("id").annotate(book_price=Cou
nt('id'))

 

在這裡插入圖片描述
7.去重

如果多個查詢資料合併到一起,則有可能會出現重複現象,因此需要去重,如下:

b1=book.objects.filter(id__lt=6,id__gt=1)#獲取id大於1且小於6的值
b2=book.objects.filter(id__in=[1,2,3]) #獲取id等於1,2,3的資料
b3=book.objects.filter(id__range=[1,5]) #獲取id為1~5之間的資料
b4=b1 | b2 | b3
b4.distinct()

 

這樣即可去重。如圖:
在這裡插入圖片描述

八、總結

以上就是django操作資料庫的最常用到的函式以及功能了,把這些學會了基本上你就能開發一個簡易的小部落格網站了。