左上角的關注按鈕沒,不要覺得麻煩哦,點擊上面的關注按鈕快關注我吧,你的關注就是我不懈的動力!
1. ORM的功能
Django的ORM可以操作數據庫的表結構和數據行。操作表結構體現在創建表、修改表和刪除表,操作數據行則體現在對錶的CURD操作,也就是增刪改查。Django的ORM本身不支持連接數據庫,實質上使用的是第三方工具如 pymysql 或者是 sqlalchemy 來連接數據庫
。
2. 數據庫設置
Django默認使用的是SQLite,也是Django中自帶的數據庫,但是我們一般不會使用。我們通常會使用SQLite之外的數據庫,如mysql、oracle、postgresql等。所以,需要在Django中修改默認使用的SQLite爲其它的數據庫。在 settings.py
中找到 DATABASES
變量:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
如果使用的是mysql數據,修改爲:
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
'ENGINE': 'django.db.backends.mysql',
'NAME': '數據庫的名稱',
'USER': '用戶名',
'PASSWORD': '密碼',
'HOST': '數據庫地址',
'PORT': '數據庫端口'
}
}
設置ORM使用 pymysql
連接數據庫,只需要在與 settings.py
同級目錄下的 __init__.py
這個空文件中寫入:
import pymysql
pymysql.install_as_MySQLdb()
配置文件 setting.py
中的 INSTALLED_APPS
下包含了在Django實例中激活的所有Django應用程序的名稱,這些應用程序都是隨Django一起提供的:
django.contrib.admin:管理站點
django.contrib.auth:認證系統
django.contrib.contenttypes :內容類型的框架
django.contrib.sessions:會話框架
django.contrib.messages:消息傳遞框架
django.contrib.staticfiles:用於管理靜態文件的框架
這些應用中的一些應用程序 至少使用一個數據庫表
,因此我們需要在數據庫中創建表之後才能使用它們,執行下面的命令來創建:
(django_test) thanlon@thanlon:~/projects/PycharmProjects/django_test$ python manage.py migrate
可以在數據庫看到創建的數據表:
mysql> show tables;
+----------------------------+
| Tables_in_django_test |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+----------------------------+
10 rows in set (0.00 sec)
migrate命令獲取所有尚未應用的遷移(Django使用名爲的特殊表在數據庫中跟蹤應用了哪些遷移django_migrations),並針對數據庫運行它們。本質上,將你對模型所做的更改與數據庫。遷移功能非常強大,可以在開發項目時隨時間更改模型,而無需刪除數據庫或表並創建新的模型。它專門用於實時升級數據庫而不會丟失數據。
3. makemigrations和migrate
接下來需要到模型中創建類和字段,創建完成後需要先使用 python manage.py makemigrations
命令來爲數據表的更改創建遷移,然後使用 python manage.py migrate
將更改應用到數據庫。之所以使用單獨的命令來進行和應用遷移,是因爲你會將遷移提交到版本控制系統,並隨應用程序一起交付。這些單獨的命令不僅使您的開發更加容易,而且還可以被其他開發人員和生產環境使用
。
4. ORM創建數據表
在 models.py
文件中寫模型,這裏分別創建員工表和部門表:
from django.db import models
class Depart(models.Model):
"""
創建部門表
"""
title = models.CharField(max_length=32, unique=True)
class EmpInfo(models.Model):
"""
創建員工信息表
"""
# 主鍵默認是id,寫與不寫名字都是id,類型是int且爲主鍵和自動遞增
nid = models.AutoField(primary_key=True)
username = models.CharField(max_length=32)
pwd = models.CharField(max_length=64)
# 'max_length' is ignored when used with IntegerField.
age = models.IntegerField()
# 會自動創建dp_id字段
dp = models.ForeignKey("Depart", on_delete=models.CASCADE, null=True)
執行創建遷移和應用更改的命令後會創建兩張表:
部門表:
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| title | varchar(32) | NO | UNI | NULL | |
+-------+-------------+------+-----+---------+----------------+
員工表:
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| nid | int | NO | PRI | NULL | auto_increment |
| username | varchar(32) | NO | | NULL | |
| pwd | varchar(64) | NO | | NULL | |
| age | int | NO | | NULL | |
| dp_id | int | YES | MUL | NULL | |
+----------+-------------+------+-----+---------+----------------+
生成遷移記錄和應用遷移有問題可以在評論區留言!
5. ORM單表CURD
數據的增加:
from django.shortcuts import render, HttpResponse, reverse
from app01 import models
# Create your views here.
def index(request):
models.Depart.objects.create(title='技術部')
models.Depart.objects.create(title='運維部')
models.EmpInfo.objects.create(username='Thanlon', pwd='123456', age=23, dp_id=3)
return render(request, 'index.html')
部門表:
+----+-----------+
| id | title |
+----+-----------+
| 2 | 技術部 |
| 1 | 運維部 |
+----+-----------+
員工表:
+-----+----------+--------+-----+-------+
| nid | username | pwd | age | dp_id |
+-----+----------+--------+-----+-------+
| 1 | Thanlon | 123456 | 23 | 1 |
+-----+----------+--------+-----+-------+
數據的查詢:
from django.shortcuts import render, HttpResponse, reverse
from app01 import models
def index(request):
# 查詢所有部門信息
dp_list = models.Depart.objects.all()
print(dp_list) # <QuerySet [<Depart: Depart object (2)>, <Depart: Depart object (1)>]>
for item in dp_list:
print(item.id, item.title)
"""
2 技術部
1 運維部
"""
# 查詢滿足條件的數據行
# emp_list_id = models.EmpInfo.objects.filter(name='thanlon').first()
# dp_list_id = models.Depart.objects.filter(id=1)
# dp_list_id = models.Depart.objects.filter(id__lt=2)
dp_list_id = models.Depart.objects.filter(id__gt=1)
for item in dp_list_id:
print(item.id, item.title) # 2 技術部
return render(request, 'index.html')
數據的刪除:
from django.shortcuts import render, HttpResponse, reverse
from app01 import models
# Create your views here.
def index(request):
# 刪除id=2的部門
models.Depart.objects.filter(id=2).delete()
return render(request, 'index.html')
+----+-----------+
| id | title |
+----+-----------+
| 1 | 運維部 |
+----+-----------+
數據表的修改:
from django.shortcuts import render, HttpResponse, reverse
from app01 import models
# Create your views here.
def index(request):
# 修改id=1的部門信息
models.Depart.objects.filter(id=1).update(title="人事部")
return render(request, 'index.html')
+----+-----------+
| id | title |
+----+-----------+
| 1 | 人事部 |
+----+-----------+