五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動態(tài)

Django與數(shù)據(jù)庫交互的實現(xiàn)

發(fā)布日期:2022-03-23 10:18 | 文章來源:源碼中國

1 如何創(chuàng)建項目數(shù)據(jù)庫

首先,在虛擬機數(shù)據(jù)庫中建立一個與項目同名的數(shù)據(jù)庫,方便管理。

(django_test) bd@DF:~$ mysql -u admin -p

輸入密碼,進入數(shù)據(jù)庫后。

mysql> SHOW DATABASES;

查看當前所有已有的數(shù)據(jù)庫,然后創(chuàng)建數(shù)據(jù)庫。

mysql> CREATE DATABASE 'django_test';

就會有一個名為‘django_test'的數(shù)據(jù)庫。

+--------------------+
| Database  |
+--------------------+
| information_schema |
| django_test  |
| mysql  |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.10 sec)

2 進行數(shù)據(jù)庫與django的交互

有了數(shù)據(jù)庫之后,我們需要把這個庫配置到項目中,進行關(guān)系綁定。
首先在settings.py文件中的DATABASES一項:

DATABASES = {
 'default': {
  # 'ENGINE': 'django.db.backends.sqlite3',
  # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  'ENGINE': 'django.db.backends.mysql',# 數(shù)據(jù)庫引擎
  'NAME': 'django_test',  # 哪一個數(shù)據(jù)庫
  'USER': 'admin',  # 用戶
  'PASSWORD': 'yourpassword',  # 數(shù)據(jù)庫密碼
  'HOST': '127.0.0.1',# 數(shù)據(jù)庫服務(wù)器IP
  'PORT': '3306'  # 數(shù)據(jù)庫端口(需要去ubuntu中設(shè)置端口轉(zhuǎn)發(fā),虛擬機的端口是3306,我們直接轉(zhuǎn)發(fā)到本地3306)
 }
}

將默認的配置注釋掉,然后帶上自己的數(shù)據(jù)庫信息.端口轉(zhuǎn)發(fā)(ubuntu):


由于需要操作mysql數(shù)據(jù)庫,所以需要在虛擬環(huán)境中安裝pymysql,注意:需要一定要在對應(yīng)的虛擬環(huán)境中安裝。

pip install mysql -i https://pypi.douban.com/simple

使用豆瓣源會快一些。然后pip list 查看自己是否已經(jīng)有pymysql。有了之后,進入項目總目錄下的__init__.py文件。

import pymysql
pymysql.install_as_MySQLdb()

添加兩行代碼,完成映射的導入。然后去我們需要進行數(shù)據(jù)庫交互的app中的models.py.

from django.db import models
# Create your models here.
class User(models.Model):
 # id = models.AutoField(primary_key=True)  # 主鍵字段不需要我們自己寫
 name = models.CharField(max_length=30)
 age = models.IntegerField(null=True)
 sex = models.IntegerField(null=True)
 city = models.CharField(max_length=30, null=True)
 note = models.TextField(null=True)
 create_time = models.DateTimeField(auto_now_add=True)
 update_time = models.DateTimeField(auto_now=True)

這里我們定義了很多項,然后對應(yīng)的數(shù)據(jù)類型是需要注意的(根據(jù)你定義的項的數(shù)據(jù)類型來),括號里面的限定信息也需要注意。數(shù)據(jù)類型:

類型 說明
AutoField 自動增長的IntegerField,通常不用指定,不指定時Django會自動創(chuàng)建屬性名為id的自動增長屬性
BooleanField 布爾字段,值為True或False
NullBooleanField 支持Null、True、False三種值
CharField 字符串,參數(shù)max_length表示最大字符個數(shù)
TextField 大文本字段,一般超過4000個字符時使用
IntegerField 整數(shù)
DecimalField 十進制浮點數(shù), 參數(shù)max_digits表示總位數(shù), 參數(shù)decimal_places表示小數(shù)位數(shù)
FloatField 浮點數(shù)
DateField 日期, 參數(shù)auto_now表示每次保存對象時,自動設(shè)置該字段為當前時間,用于"最后一次修改"的時間戳,它總是使用當前日期,默認為False; 參數(shù)auto_now_add表示當對象第一次被創(chuàng)建時自動設(shè)置當前時間,用于創(chuàng)建的時間戳,它總是使用當前日期,默認為False; 參數(shù)auto_now_add和auto_now是相互排斥的,組合將會發(fā)生錯誤
TimeField 時間,參數(shù)同DateField
DateTimeField 日期時間,參數(shù)同DateField
FileField 上傳文件字段
ImageField 繼承于FileField,對上傳的內(nèi)容進行校驗,確保是有效的圖片

限定條件:

選項 說明
null 如果為True,表示允許為空,默認值是False
blank 如果為True,則該字段允許為空白,默認值是False
db_column 字段的名稱,如果未指定,則使用屬性的名稱
db_index 若值為True, 則在表中會為此字段創(chuàng)建索引,默認值是False
default 默認值
primary_key 若為True,則該字段會成為模型的主鍵字段,默認值是False,一般作為AutoField的選項使用
unique 如果為True, 這個字段在表中必須有唯一值,默認值是False
max_length 字段長度限制
DateField.auto_now 修改數(shù)據(jù)時,更新時間,使用save方法才會有用
DateField.auto_now_add 第一次添加會將當前時間設(shè)置進去,修改不會

在完成數(shù)據(jù)的導入之后,我們就要在虛擬機中進行遷移。移動到項目目錄下。

python manage.py makemigrations

命令后面可以跟app名稱,指定對某個app的模型進行映射,如果沒有寫,就所有的app都回去創(chuàng)建映射文件。再次之前,你必須保證你的app都在settings里面注冊了。
在遷移完之后,我們需要將遷移的數(shù)據(jù)提交給數(shù)據(jù)庫(在虛擬機中且在目錄下):

python manage.py migrate

我們可以這樣理解,遷移是將我們在user類中定義的數(shù)據(jù)項轉(zhuǎn)化為create table這樣的mysql語句,然后就是將語句提交到數(shù)據(jù)庫中創(chuàng)建表。
創(chuàng)建完成后,我們在數(shù)據(jù)庫中查看是否完成操作:

mysql> show databases;
+--------------------+
| Database  |
+--------------------+
| information_schema |
| django_test  |
| mysql  |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use django_test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-----------------------+
| Tables_in_django_test |
+-----------------------+
| django_migrations  |
| six_user  |
+-----------------------+
2 rows in set (0.00 sec)
mysql> describe six_user;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type  | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| id | int(11)  | NO| PRI | NULL | auto_increment |
| name  | varchar(30) | NO|  | NULL | |
| age| int(11)  | YES  |  | NULL | |
| sex| int(11)  | YES  |  | NULL | |
| note  | longtext | YES  |  | NULL | |
| create_time | datetime(6) | NO|  | NULL | |
| update_time | datetime(6) | NO|  | NULL | |
| city  | varchar(30) | YES  |  | NULL | |
+-------------+-------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

這里我們首先show databases;查看庫,再進入我們的項目數(shù)據(jù)庫,選擇six_user查看表格。完成實現(xiàn)數(shù)據(jù)表創(chuàng)建操作。

如果我們需要修改表,那么我們只需要修改模型類就可以了,如果我們需要在模型類中添加一個字段,那么我們不能直接增加,因為增加一個不可為空的字段會存在一個邏輯錯誤。即添加一個本身為空(添加進去的時候是空的)的不可為空字段是不被允許的,所以我們需要在括號中添加null=True。
如上面模型類的city字段,添加完成后,進行遷移和提交即可,就是上面兩個步驟,刪除也是一樣的,也就是說,只要是更新模型類,都需要上面2個步驟。

3 添加數(shù)據(jù)

如果我們需要添加數(shù)據(jù),我們試一下

from django.http import HttpResponse, HttpResponseNotFound
from django.shortcuts import redirect, render
from .models import User
# Create your views here.
def add_user(request):
 # 方法一
 # user = User(name='zjj', age=18)
 # user.save()  # 使用save方法保存提交數(shù)據(jù)
 # return HttpResponse('添加成功')
 # 方法二
 # user = User()
 # user.name = 'zj'
 # user.age = 18
 # user.save()
 # return  HttpResponse('添加成功')
 # 方法三
 # User.objects.create(name='z', age=8)
 # return HttpResponse('添加成功')
 # 方法四  get_or_create會判斷有沒有傳入的數(shù)據(jù)(指完全一致的數(shù)據(jù)),如果有則不創(chuàng)建,只獲取,如果沒有則創(chuàng)建,并獲取,返回一個元組。
 user, flag = User.objects.get_or_create(name='z1', age=10)
 message = '添加成功'
 if not flag:
  message = '已有數(shù)據(jù)'
 print(user.name, user.create_time)
 return HttpResponse(message)

這里我們首先需要引入models類中我們定義的User類,然后通過對User類實例化進行添加,以上舉例了四種方法,前兩種方法都需要使用save方法,后面兩種是調(diào)用對象的方法直接添加數(shù)據(jù),較為方便,這里需要講一下最后一個方法,這個方法會判斷傳入數(shù)據(jù),如果沒有傳入數(shù)據(jù),就會首先創(chuàng)建,然后獲取該數(shù)據(jù),返回一個True,這里我在上面print了幾條數(shù)據(jù),可以去測試一下。如果是重復數(shù)據(jù),就會不創(chuàng)建,返回數(shù)據(jù),加一個False。那么我們在這里進行一個拆包,獲取兩個參數(shù),然后做一個判斷,這樣就可以進行頁面的信息傳遞。

mysql> SELECT * FROM `six_user`;
+----+------+------+------+------+----------------------------+----------------------------+------+
| id | name | age  | sex  | note | create_time | update_time | city |
+----+------+------+------+------+----------------------------+----------------------------+------+
|  1 | zjj  |18 | NULL | NULL | 2021-03-10 21:40:18.246543 | 2021-03-10 21:40:18.246564 | NULL |
|  2 | zj|18 | NULL | NULL | 2021-03-10 21:44:36.590347 | 2021-03-10 21:44:36.590365 | NULL |
|  3 | z | 8 | NULL | NULL | 2021-03-10 21:46:37.315176 | 2021-03-10 21:46:37.315195 | NULL |
|  4 | z1|10 | NULL | NULL | 2021-03-10 21:56:20.559386 | 2021-03-10 21:56:20.559421 | NULL |
+----+------+------+------+------+----------------------------+----------------------------+------+
4 rows in set (0.00 sec)

然后還有一種方法就是在前端頁面添加數(shù)據(jù),然后后端接收后添加入數(shù)據(jù)庫。
第一步,在路由中添加接收信息:

from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
 path(r'add_user/<name>/<age>', views.add_user)
]

視圖函數(shù)中:

def add_user(request, name, age):
 user, flag = User.objects.get_or_create(name=name, age=age)
 message = '添加成功'
 if not flag:
  message = '已有數(shù)據(jù)'
 print(user.name, user.create_time)
 return HttpResponse(message)

這樣我們就可以在前端接收數(shù)據(jù)后,直接添加入數(shù)據(jù)庫

mysql> SELECT * FROM `six_user`;
+----+------+------+------+------+----------------------------+----------------------------+------+
| id | name | age  | sex  | note | create_time | update_time | city |
+----+------+------+------+------+----------------------------+----------------------------+------+
|  1 | zjj  |18 | NULL | NULL | 2021-03-10 21:40:18.246543 | 2021-03-10 21:40:18.246564 | NULL |
|  2 | zj|18 | NULL | NULL | 2021-03-10 21:44:36.590347 | 2021-03-10 21:44:36.590365 | NULL |
|  3 | z | 8 | NULL | NULL | 2021-03-10 21:46:37.315176 | 2021-03-10 21:46:37.315195 | NULL |
|  4 | z1|10 | NULL | NULL | 2021-03-10 21:56:20.559386 | 2021-03-10 21:56:20.559421 | NULL |
|  5 | zjjj |21 | NULL | NULL | 2021-03-10 22:06:47.200072 | 2021-03-10 22:06:47.200101 | NULL |
+----+------+------+------+------+----------------------------+----------------------------+------+
5 rows in set (0.00 sec)

4 查找數(shù)據(jù)

4.1查找所有數(shù)據(jù)

查找數(shù)據(jù)方法,我們先定一個函數(shù)來試試看:

def find_user(request):
	# 查詢所有數(shù)據(jù)
 user_list = User.objects.all()
 print(user_list)
 return HttpResponse('查詢成功')

記得添加路由,然后我們在模型類下使用魔法方法修改print方法

 def __str__(self):
  return 'id=%s, name=%s, age=%s, city=%s, note=%s' % (self.id, self.name, self.age, self.city, self.note)

那么我們在print數(shù)據(jù)時可以看的清楚一些。


上面是查詢所有數(shù)據(jù)。那么如何查詢一個數(shù)據(jù)呢?

4.2查詢一個數(shù)據(jù)

def find_user(request):
	# 查詢一個數(shù)據(jù)
 user = User.objects.get(id=1)
 print(user, type(user))
 return HttpResponse('查詢成功')


這里需要注意的是,get方法是用來查詢唯一數(shù)據(jù),如果你輸入的條件不是唯一的,會直接報錯。那么查詢多個數(shù)據(jù)?

4.3查詢多條數(shù)據(jù)

def find_user(request):
 # 查詢多條數(shù)據(jù)
 user_list = User.objects.filter(name=18)
 print(user_list, type(user_list))
 return HttpResponse('查詢成功')

這里我們使用filter方法


這里返回的是一個集合對象(可迭代對象,即可被for循環(huán))。

def find_user(request):
 # 查詢多條數(shù)據(jù)
 user_list = User.objects.filter(age=18)
 for user in user_list:
  print(user)
 # print(user_list, type(user_list))
 return HttpResponse('查詢成功')

這樣就能返回多條信息。


不僅如此,該對象還可以切片。

def find_user(request):
 # 查詢多條數(shù)據(jù)
 user_list = User.objects.filter(age=18)
 # for user in user_list:
 #  print(user)
 # print(user_list, type(user_list))
 print(user_list[0:1])
 return HttpResponse('查詢成功')

還可以轉(zhuǎn)型

def find_user(request):
 # 查詢多條數(shù)據(jù)
 user_list = User.objects.filter(age=18)
 # for user in user_list:
 #  print(user)
 # print(user_list, type(user_list))
 # print(user_list[0:1])
 print(list(user_list))
 return HttpResponse('查詢成功')

4 更新數(shù)據(jù)

更新數(shù)據(jù)的步驟就是先獲得到你要修改的數(shù)據(jù),然后對其進行重新賦值

4.1獲取數(shù)據(jù)

from django.shortcuts import render
from django.http import HttpResponse
from six.models import User
from django.db.models import Count, Avg, Min, Max, Sum, F, Q
# Create your views here.
# 常用的查詢方法
def find(request):
 # 獲取所有數(shù)據(jù)
 rs = User.objects.all()
 # 獲取第一條數(shù)據(jù)
 rs = User.objects.first()
 # 獲取最后一條方法
 rs = User.objects.last()
 # 獲取指定條件的多條數(shù)據(jù)
 rs = User.objects.filter(age=18)
 # 獲取唯一的一條數(shù)據(jù),一般的get返回對象具有唯一性(一般用id來查),如果有多個就會報錯,可以用try來處理
 rs = User.objects.get(id=3)

這里的方法很多,可根據(jù)需要來

4.2對數(shù)據(jù)排序

 # 對結(jié)果排序
 rs = User.objects.order_by('age')  # 正序,從小到大
 rs = User.objects.order_by('-age')  # 倒序,從大到小
 # 多項排序
 rs = User.objects.order_by('age', '-id')
	
	# 獲取當前查詢到的數(shù)據(jù)的總數(shù),只需要在查找后面加上count方法即可
 rs = User.objects.filter(age=28).count()
 # 將返回的QuerySet中的Model轉(zhuǎn)換成字典,轉(zhuǎn)換成字典之后,我們可以進行迭代用鍵取值
 rs = User.objects.all().values()
 for i in rs:
  print(i['name'])
 print(rs)

4.3查詢條件

 # 常用查詢條件
 # 相當于WHERE語句后面的提交,傳給查詢方法的一些參數(shù)
 # 語法規(guī)則 :字段名__條件, 注意是兩個下劃線
 # 等于
 rs = User.objects.filter(age=18)
 # 包含  模糊查詢
 rs = User.objects.filter(name__contains='j')
 # 大于
 rs = User.objects.filter(age__gt=18)
 # 大于等于
 rs = User.objects.filter(age__gte=18)
 # 小于
 rs = User.objects.filter(age__lt=18)
 # 小于等于
 rs = User.objects.filter(age__lte=18)
 # 判斷是否為空
 rs = User.objects.filter(city__isnull=True)
 # 以什么開始
 rs = User.objects.filter(name__startwith='z')
 # 以什么結(jié)尾
 rs = User.objects.filter(name__endwith='1')
 # 多個條件 成員所屬,是否在我們給的列表條件中
 rs = User.objects.filter(name__in=['zj', 'zjj', 'zjjjj'])
 # 范圍  包含開頭和結(jié)尾
 rs = User.objects.filter(age__range=(18, 28))

4.4聚合查詢

Count, Avg, Min, Max, Sum主要有這些方法

 from django.db.models import Count, Avg, Min, Max, Sum, F, Q
 # 可以使用聚合查詢進行聚合查詢, Count,Avg, Max, Min, Sum.這是需要導入的
 # aggregate()是QuerySet的一個終止語句,返回的是一個包含鍵值對的字典
 # 統(tǒng)計條數(shù)
 rs = User.objects.all().aggregate(Count('age'))
 # 求年齡平均值
 rs = User.objects.all().aggregate(Avg('age'))
 # 求年齡最大值
 rs = User.objects.all().aggregate(Max('age'))
 # 求年齡最小值
 rs = User.objects.all().aggregate(Min('age'))
 # 年齡求和
 rs = User.objects.all().aggregate(Sum('age'))
 # 可以修改key的值  以上的返回值都是一個鍵值對,我們可以更改key的值
 rs = User.objects.all().aggregate(ageSum=Sum('age'))

4.5分組查詢

	# 分組查詢
 # 調(diào)用的QuerySet中每個對象都生成一個獨立的統(tǒng)計值
 # 拿出需要分組的字段  values方法是獲得括號里,在數(shù)據(jù)庫中所有該屬性的值,并返回鍵值對類型的字典
 rs = User.objects.values('age')
 # 對age這個字段進行分組 ,這里使用的計數(shù)函數(shù),即返回的字典里顯示該age的個數(shù)的鍵值對
 rs = rs.annotate(count=Count('age'))
 # 或者使用這個方法
 rs = User.objects.values('age').annotate(count=Count('age'))

F和Q查詢

from django.db.models import F, Q
	# F查詢也需要導入
 # 給User表中的所有人加一歲(+1), 減一歲就-1
 rs = User.objects.all().update(age=F('age') + 1)
 # Q查詢
 # 如果需要執(zhí)行更加復雜的查詢,可以使用Q對象
 # & (and) | (or) ~ (not)  
 # 查詢名字尾zj或者年齡為18的用戶
 rs = User.objects.filter(Q(name='zj') | Q(age=18))
 # 查詢名字為zjjj,并且年齡不等于28
 rs = User.objects.filter(Q(name='zjjj') & ~Q(age=28))
 print(rs)
 return HttpResponse('查找成功')

Q查詢一般用于邏輯查詢

到此這篇關(guān)于Django與數(shù)據(jù)庫交互的實現(xiàn)的文章就介紹到這了,更多相關(guān)Django 數(shù)據(jù)庫交互內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

香港穩(wěn)定服務(wù)器

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部