目錄
一:pycharm鏈接數據庫(MySQL)
1.pycharm右側Database工具欄
三個位置查找數據庫相關
1.右側上方database
2.左下方database
3.配置里面的plugins插件搜索安裝
注意:
都沒有再沒有卸載pycharm重新裝
2.下載對應的驅動,填寫MySQL數據庫信息連接(當前為客戶端)
pycharm可以充當很多款數據庫軟件的客戶端
3.pycharm連接MySQL數據庫
二:django鏈接數據庫(MySQL)
1.修改配置文件中數據庫設置成django連接MySQL
# django配置文件中默認用的是sqlite3數據庫
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# django鏈接MySQL(修改sqlite3數據庫)
1.第一步配置文件中配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 修改成MySQL數據庫
'NAME': 'day60', # 連接數據庫名稱 先創建好才能指定
'USER':'root', # 數據庫名稱
'PASSWORD':'admin123', # 數據庫密碼
'HOST':'127.0.0.1', # 數據庫ip 本地回環地址
'PORT':3306, # 數據庫端口
'CHARSET':'utf8' # 指定字符編碼
}
}
2.手動將默認mysqldb改為pymysql
2.代碼聲明 在項目文件夾或者應用文件夾內的__init__.py文件中書寫固定的代碼
django默認用的是mysqldb模塊鏈接MySQL
但是該模塊的兼容性不好 需要手動改為用pymysql鏈接
import pymysql
pymysql.install_as_MySQLdb() # pyMySQL取代MySQLDB
三:Django ORM
1.ORM簡介
"""
ORM:對象關系映射
作用:目的就是為了能夠讓不懂SQL語句的人通過python面向對象的知識點也能夠輕松自如的操作數據庫
缺陷:封裝程度太高,有時候sql語句的效率偏低,需要自己寫SQL語句
"""
類 ---------------->>> 表
對象 --------------->>> 表里面的數據
對象點屬性 ---------->>> 字段對應的值
2.模型類需要寫在應用下的models.py文件中
# 必須要繼承父類
class User(models.Model):
# id int primary_key auto_increment
id = models.AutoField(primary_key=True)
# username varchar(32) # CharField必須要加max_length參數,不加報錯
username = models.CharField(max_length=32)
# password int
password = models.IntegerField()
3.數據庫遷移命令(非常重要)
打開terminal輸入命令
********************************************************************
2 數據庫遷移命令 將操作記錄記錄到(migrations文件夾)
python3 manage.py makemigrations
2.將操作真正的同步到數據庫中
python3 manage.py migrate
********************************************************************
警記*****:
只要你修改了models.py中跟數據庫相關的代碼 就必須重新執行上述的兩條命令
4.數據庫同步
5.針對主鍵字段
class User(models.Model):
# id int primary_key auto_increment
id = models.AutoField(primary_key=True,verbose_name='主鍵')
# username varchar(32)
username = models.CharField(max_length=32,verbose_name='用戶名')
"""
CharField必須要指定max_length參數 不指定會直接報錯
verbose_name該參數是所有字段都有的 就是用來對字段的解釋
"""
# password int
password = models.IntegerField(verbose_name='密碼')
class Author(models.Model):
# 由於一張表中必須要有一個主鍵字段 並且一般情況下都叫id字段
# 所以orm當你不定義主鍵字段的時候 orm會自動幫你創建一個名為id主鍵字段
# 也就意味着 后續我們在創建模型表的時候如果主鍵字段名沒有額外的叫法 那么主鍵字段可以省略不寫
# username varchar(32)
username = models.CharField(max_length=32)
# password int
password = models.IntegerField()
四:字段的增刪改查
1.字段的增加
1.可以在終端內直接給出默認值
2.該字段可以為空
info = models.CharField(max_length=32,verbose_name='個人簡介',null=True)
3.直接給字段設置默認值
hobby = models.CharField(max_length=32,verbose_name='興趣愛好',default='study')
2.字段的修改
直接修改代碼 然后執行數據庫遷移的兩條命令即可!
3.字段的刪
直接注釋對應的字段然后執行數據庫遷移的兩條命令即可!
執行完畢之后字段對應的數據也都沒有了
刪除字段(注意):
在操作models.py的時候一定要細心
千萬不要注釋一些字段
執行遷移命令之前最好先檢查一下自己寫的代碼
五:數據的增刪改查
1.查詢數據
# select * from user where username='jason':
user_obj = models.User.objects.filter(username=username).first()
"""
返回的結果是一個querySet對象 你可以把它看成是一個列表套數據對象格式
[數據對象1, 數據對象2...]
"""
它也支持索引取值 切片操作 但是不支持負數索引
它也不推薦你使用索引的方式取值,而是使用封裝好的 .first()方法
filter括號內可以攜帶多個參數 參數與參數之間默認是and關系
你可以把filter連想成where記憶
- views.py文件
from django.shortcuts import render, HttpResponse
from app01 import models
# 登錄
def login(request):
# 返回一個登錄界面
"""
get請求和post請求應該有不同的處理機制
:param request: 返回請求方式 並且是全大寫的字符串形式
:return:
"""
if request.method == 'POST':
# 獲取頁面用戶的用戶名和密碼 然后利用orm操作數據 效驗數據是否正確
username = request.POST.get('username')
# select * from user where username='jason':
password = request.POST.get('password')
# 去數據庫中查詢數據
# print(password)
# 1.導入models文件
from app01 import models
# 獲取數據庫內存儲的用戶名與密碼
user_obj = models.User.objects.filter(username=username).first()
# <QuerySet [<User: User object>]> [數據對象1, 數據對象2...]
if user_obj:
# 頁面用戶輸入密碼對比數據庫存儲密碼是否一致
if password == user_obj.password:
return HttpResponse('登錄成功')
else:
return HttpResponse('密碼錯誤')
else:
return HttpResponse('用戶不存在')
# GET返回html頁面文件
return render(request, 'login.html')
2.添加數據
- 第一種增加
from app01 import models
res = models.User.objects.create(username=username,password=password)
# 返回值就是當前被創建的對象本身
- 第二種增加
# 類加對象實列化產生了對象
user_obj = models.User(username=username,password=password)
# 對象調封裝的方法 保存數據
user_obj.save()
3.注冊功能
def register(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 直接獲取用戶數據存入數據庫
# 導入models
from app01 import models
res = models.User.objects.create(username=username,password=password)
# 返回值就是當前被創建的對象本身
print(res)
# 第二種增加
# 類加對象實列化產生了對象
# user_obj = models.User(username=username,password=password)
# 對象調封裝的方法 保存數據
# user_obj.save()
# 先給用戶返回一個注冊頁面
return render(request,'reg.html')
六:前端(數據的查,改,刪)
1.需求
先將數據庫中的數據全部展示到前端 然后給每一個數據兩個按鈕 一個編輯一個刪除
2.查
# 展示用戶功能
def userlist(request):
# 查詢出用戶表里面所以的數據
# 方式1
# data = models.User.objects.filter() # filter類似於where
# 方式2
user_queryset = models.User.objects.all() # 獲取表內所有數據
# <QuerySet [<User: objk>, <User: oscas>, <User: zll>...]>
# locals() 將當前名稱空間中的名字全部傳遞給html文件
return render(request, 'userlist.html',locals())
3.改
1.點擊編輯按鈕朝后端發送編輯數據的請求
2.如何告訴后端用戶想要編輯哪條數據?
將編輯按鈕所在的那一行數據的主鍵值發送給后端
利用url問號后面攜帶參數的方式
- 前端修改
{# 當用戶點擊a標簽 a標簽會向edit_user 發送一個get請求 #}
{# ?問號后面的參數不參與路徑匹配 獲取當前用戶點擊對應的主鍵值 #}
<a href="/edit_user/?user_id={{ user_obj.id }}" class="btn btn-primary btn-xs">編輯</a>
<a href="" class="btn btn-danger btn-xs">刪除</a>
- 后端修改
# 修改數據的方式1
# models.User.objects.filter(id=edit_id).update(username=username, password=password)
"""
將filter查詢出來的列表中所有的對象全部更新 批量更新操作
"""
# 修改數據的方式2
edit_obj.username = username
edit_obj.password = password
edit_obj.save()
"""
上述方法當字段特別多的時候效率會非常低
從頭到尾將數據的所有字段全部更新一邊 無論該字段是否被修改
"""
- userlist.html
<tbody>
{#模板語法 for + tab#}
{% for user_obj in user_queryset %}
<tr>
<td>{{ user_obj.id }}</td>
<td>{{ user_obj.username }}</td>
<td>{{ user_obj.password }}</td>
<td>
{# 當用戶點擊a標簽 a標簽會向edit_user 發送一個get請求 #}
{# ?問號后面的參數不參與路徑匹配 獲取當前用戶點擊對應的主鍵值 #}
<a href="/edit_user/?user_id={{ user_obj.id }}" class="btn btn-primary btn-xs">編輯</a>
<a href="" class="btn btn-danger btn-xs">刪除</a>
</td>
</tr>
{% endfor %}
</tbody>
后端查詢出用戶想要編輯的數據對象 展示到前端頁面供用戶查看和編輯
# 編輯用戶功能
def edit_user(request):
# 獲取url問號后面的主鍵值參數
edit_id = request.GET.get('user_id')
# 查詢當前用戶想要編輯的數據對象
edit_obj = models.User.objects.filter(id=edit_id).first() # 拿到的是一個列表.first
# 判斷用戶是否是POST請求
if request.method == "POST":
# 獲取用戶名和密碼
username = request.POST.get('username')
password = request.POST.get('password')
# 去數據庫中修改對應的數據內容
# 修改數據的方式1
# models.User.objects.filter(id=edit_id).update(username=username, password=password)
"""
將filter查詢出來的列表中所有的對象全部更新 批量更新操作
"""
# 修改數據的方式2
edit_obj.username = username
edit_obj.password = password
edit_obj.save()
"""
上述方法當字段特別多的時候效率會非常低
從頭到尾將數據的所有字段全部更新一邊 無論該字段是否被修改
"""
# 跳轉到數據展示頁面
return redirect('/userlist/')
# 將數據對象展示到頁面上
return render(request, 'edit_user.html', locals())
4.刪
# 刪除功能
models.User.objects.filter(id=delete_id).delete()
"""
delete:
批量刪除
"""
def delete_user(request):
# 獲取用戶想要刪除的數據id值
delete_id = request.GET.get('user_id')
# 直接去數據庫中找到對應的數據刪除即可
models.User.objects.filter(id=delete_id).delete()
"""
delete:
批量刪除
"""
# 跳轉到頁面
return redirect('/userlist/')
知識儲備:
# 刪除數據內部其實並不是真正的刪除 我們會給數據添加一個標識字段用來表示當前數據是否被刪除了,如果數據被刪了僅僅只是將字段修改一個狀態
username password is_delete
jason 123 0
egon 123 1