一.Python 的数据库操作
我们经常使用Python来操作数据库,用的最多的就是pymysql这个库
import pymysql
# 1.连接MySQL
conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd="root123", charset='utf8', db='unicom')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 2.发送指令
cursor.execute("insert into admin(username,password,mobile) values('admin','123456','15155555555')")
conn.commit()
# 3.关闭
cursor.close()
conn.close()
二. Django中的数据库操作
Django开发操作数据库更简单,内部提供了ORM框架。
image.png
2.1 安装第三方模块
pip install mysqlclient
如果上面安装失败了,可以去下载对应的安装包来安装
image.png
2.2 ORM
ORM可以帮助我们做两件事:
- 创建、修改、删除数据库中的表(不用你写SQL语句)。 【无法创建数据库】
- 操作表中的数据(不用写SQL语句)。
2.2.1 创建自己的数据库
create database django_test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
image.png
2.2.2 django连接数据库
在settings.py文件中进行配置和修改。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_test', # 数据库名字
'USER': 'root',
'PASSWORD': 'abc123',
'HOST': '127.0.0.1', # 那台机器安装了MySQL
'PORT': 3306,
}
}
image.png
django连接数据库可以参考官方文档:
https://docs.djangoproject.com/zh-hans/3.2/ref/databases/
2.2.3 django操作表
- 创建表
- 修改表
- 删除表
2.2.3.1 创建表
在models.py文件中
image.png
在models.py中增加了一个class,django会自动解析为如下sql:
create table app01_userinfo(
id bigint auto_increment primary key,
name varchar(32),
password varchar(64),
age int
);
执行命令:
python manage.py makemigrations
python manage.py migrate
安装记录:
(mysite2) E:\python\Django\mysite2>pip install pymysql
Collecting pymysql
Cache entry deserialization failed, entry ignored
Using cached https://files.pythonhosted.org/packages/4f/52/a115fe175028b058df353c5a3d5290b71514a83f67078a6482cff24d6137/PyMySQL-1.0.2-py3-none-any.whl
Installing collected packages: pymysql
Successfully installed pymysql-1.0.2
You are using pip version 10.0.1, however version 22.2.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
(mysite2) E:\python\Django\mysite2>
(mysite2) E:\python\Django\mysite2>
(mysite2) E:\python\Django\mysite2>python manage.py makemigrations
Migrations for 'app01':
app01\migrations\0001_initial.py
- Create model UserInfo
(mysite2) E:\python\Django\mysite2>python manage.py migrate
System check identified some issues:
WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/3.2/ref/databases/#mysql-sql-mode
Operations to perform:
Apply all migrations: admin, app01, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying app01.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
(mysite2) E:\python\Django\mysite2>
看看mysql数据库:
2.2.3.2 修改表
在表中新增列时,由于已存在列中可能已有数据,所以新增列必须要指定新增列对应的数据
image.png
执行命令:
python manage.py makemigrations
python manage.py migrate
image.png
2.2.3.3 删除表
我们直接把class 删除掉,然后再来看效果
执行命令:
python manage.py makemigrations
python manage.py migrate
image.png
2.2.4 ORM操作表中的数据
models.py 文件
from django.db import models
# Create your models here.
class UserInfo(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField(default=2)
class Department(models.Model):
title = models.CharField(max_length=16)
执行命令:
python manage.py makemigrations
python manage.py migrate
url.py
# django orm
path('orm/', views.orm),
views.py
from app01.models import *
def orm(request):
#### 1.新建 ####
Department.objects.create(title="销售部")
Department.objects.create(title="IT部")
Department.objects.create(title="运营部")
UserInfo.objects.create(name="张三", password="123", age=19)
UserInfo.objects.create(name="李四", password="666", age=29)
UserInfo.objects.create(name="王五", password="666")
#### 2.删除 ####
UserInfo.objects.filter(id=3).delete()
Department.objects.all().delete()
#### 3.获取数据 ####
#3.1 获取符合条件的所有数据
#data_list = [对象,对象,对象] QuerySet类型
data_list = UserInfo.objects.all()
for obj in data_list:
print(obj.id, obj.name, obj.password, obj.age)
#data_list = [对象,]
data_list = UserInfo.objects.filter(id=1)
print(data_list)
#3.1 获取第一条数据【对象】
row_obj = UserInfo.objects.filter(id=1).first()
print(row_obj.name, row_obj.password, row_obj.age)
#### 4.更新数据 ####
UserInfo.objects.all().update(password=999)
UserInfo.objects.filter(id=2).update(age=999)
UserInfo.objects.filter(name="李四").update(age=999)
return HttpResponse("成功")
访问页面:
访问指定页面就可以对数据库进行增删改查的操作了,那么也就可以通过页面的操作来操作数据库了,当然这个地方只是一个最简单的案例,后面会将具体的操作给补充上。
三. 用户管理实例
3.1 展示用户信息
-
新增URL
image.png -
新增views.py下面的函数
这个步骤就是通过查询数据,将user_info下面的所有的数据都传入到前端html页面
def info_list(request):
# 1.获取数据库中所有的用户信息
# [对象,对象,对象]
data_list = UserInfo.objects.all()
# 2.渲染,返回给用户
return render(request, "info_list.html", {"data_list": data_list})
- 新增html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>INFO列表</h1>
<a href="/info/add/">添加</a>>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>密码</th>
<th>年龄</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for obj in data_list %}
<tr>
<td>{{ obj.id }}</td>
<td>{{ obj.name }}</td>
<td>{{ obj.password }}</td>
<td>{{ obj.age }}</td>
<td>
<a href="/info/delete/?nid={{ obj.id }}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
-
访问页面
添加和删除都只是增加了按钮,后面补充上对应的功能
image.png
3.2 新增用户
上一步我们已经将按钮添加到用户列表页面了
-
新增url
image.png -
views.py新增对应函数
def info_add(request):
if request.method == "GET":
return render(request, 'info_add.html')
# 获取用户提交的数据
user = request.POST.get("user")
pwd = request.POST.get("pwd")
age = request.POST.get("age")
# 添加到数据库
UserInfo.objects.create(name=user, password=pwd, age=age)
# 自动跳转
# return redirect("http://127.0.0.1:8000/info/list/")
return redirect("/info/list")
- 新增html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>添加用户</h1>
<form method="post">
{% csrf_token %}
<input type="text" name="user" placeholder="用户名">
<input type="text" name="pwd" placeholder="密码">
<input type="text" name="age" placeholder="年龄">
<input type="submit" value="提交">
</form>>
</body>
</html>
-
访问页面
image.png
image.png
3.3 删除用户
用户列表页面已经做了删除的按钮,此时只需将对应的id传到后端,然后后端调用对应函数进行删除即可
-
新增url
image.png -
views.py新增对应函数
从访问的url中获取id值,然后进行删除
def info_delete(request):
nid = request.GET.get('nid')
UserInfo.objects.filter(id=nid).delete()
return redirect("/info/list")
-
访问页面
image.png
参考:
FAQ:
1. django连接不上mysql
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
解决方案:
pip install pymysql
然后django项目初始化的时候加上
import pymysql
pymysql.install_as_MySQLdb()
image.png
2. django删表重建的办法
-
先到数据库把表删掉:drop table
-
注释django中对应的Model
-
执行命令
python manage.py makemigrations
python manage.py migrate --fake -
去掉django中对应的Model的注释
-
执行命令
python manage.py makemigrations
python manage.py migrate
网友评论