python3.8-数据库管理-Django3.2-MySql8.0安装-数据增加删除修改-字段类型-文本最大长度Text-QuerySet

文章目录

    • 1.MySQL数据库管理
      • 1.1.常用配置文件
      • 1.2.安装操作
      • 1.3.数据备份
    • 2.MySQL包含的数据类型
      • 2.1.MySql 中的整数
      • 2.2.MySql 中的浮点数
      • 2.3.日期/时间类型
      • 2.4.字符串类型
      • 2.5.二进制类型
    • 3.在Django3.2中使用QuerySet基础
      • 3.1.QuerySet的理解
      • 3.2.什么是链式调用
    • 4.QuerySet详解
      • 4.1.模型定义
      • 4.2.增加数据
      • 4.3.查询数据集
      • 4.4.更新数据
      • 4.5.删除数据
      • 4.6.排序数据
      • 4.7.其它
    • 5.总结

1.MySQL数据库管理

MySQL 是⼀种关系型数据库,因为 MySQL 是开源免费的,并且⽅便扩展,所以在网站开发中⾮常常⽤。MySQL是开放源代码的, 因此任何⼈都可以在 GPL(General Public License) 的许可下,下载并根据个性化的需要对其进⾏修 改。MySQL的默认端⼝号是3306。

1.1.常用配置文件

[mysqld]
#设置3306端口
port=3306
#设置mysql的安装目录
basedir="C:\\ZLComputeServer\\mysql-8.0.32-winx64"
#设置mysql数据库的数据的存放目录
datadir="C:\\ZLComputeServer\\mysql-8.0.32-winx64\\data"
#允许最大连接数
max_connections=200
#允许连接失败的次数。
max_connect_errors=10
#服务端使用的字符集默认为utf8mb4
character-set-server=utf8mb4
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password
[mysql]
#设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
#设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4

1.2.安装操作

数据库初始化,修改初始密码,Django3.2数据库迁移。

#数据库初始化
mysqld --initialize --console
#安装服务zl_mysql_188
mysqld --install zl_mysql
#启动服务
net start zl_mysql
#停止服务
net stop zl_mysql
#删除服务
SC delete zl_mysql

password
gRBjrAr/T5U;

#登录-定位到数据库Bin所在目录
mysql -uroot -p

#修改密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '{23403EB9-05C1-4E58-9600-8BC8D81EC7C0}';

#服务器配置
"C:/ZLComputeServer/python.exe" manage.py makemigrations
"C:/ZLComputeServer/python.exe" manage.py migrate #配置好参数之后执行迁移命令

1.3.数据备份

1、备份命令
  格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --database 数据库名 > 文件名.sql
  例如: mysqldump -h 192.168.1.100 -p 3306 -uroot -ppassword --database cmdb > /data/backup/cmdb.sql
2、备份压缩
  导出的数据有可能比较大,不好备份到远程,这时候就需要进行压缩
  格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --database 数据库名 | gzip > 文件名.sql.gz
  例如: mysqldump -h192.168.1.100 -p 3306 -uroot -ppassword --database cmdb | gzip > /data/backup/cmdb.sql.gz
3、备份同个库多个表
  格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --database 数据库名 表1 表2 … > 文件名.sql
  例如:mysqldump -h192.168.1.100 -p3306 -uroot -ppassword cmdb t1 t2 > /data/backup/cmdb_t1_t2.sql
4、同时备份多个库
  格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --databases 数据库名1 数据库名2 数据库名3 > 文件名.sql
  例如:mysqldump -h192.168.1.100 -uroot -ppassword --databases cmdb bbs blog > /data/backup/mutil_db.sql
5、备份实例上所有的数据库
  格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --all-databases > 文件名.sql
  例如:mysqldump -h192.168.1.100 -p3306 -uroot -ppassword --all-databases > /data/backup/all_db.sql
6、备份数据出带删除数据库或者表的sql备份
  格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --add-drop-table --add-drop-database 数据库名 > 文件名.sql
  例如:mysqldump -uroot -ppassword --add-drop-table --add-drop-database cmdb > /data/backup/all_db.sql
7、备份数据库结构,不备份数据
  格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --no-data 数据库名1 数据库名2 数据库名3 > 文件名.sql
  例如:mysqldump --no-data –databases db1 db2 cmdb > /data/backup/structure.sql

2.MySQL包含的数据类型

MySQL字段类型有5种:1、整数类型,主要用来存储整数数字,包括INT、BIGINT、TINYINT等;2、浮点数和定点数类型,用于存储小数,浮点数有FLOAT和DOUBLE,定点数有DECIMAL;3、字符串类型,用来存储字符串数据等。
如果使用错误的数据类型可能会严重影响应用程序的功能和性能,所以在设计表时,应该特别重视数据列所用的数据类型。更改包含数据的列不是一件小事,这样做可能会导致数据丢失。因此,在创建表时必须为每个列设置正确的数据类型和长度。

2.1.MySql 中的整数

MySQL 主要提供的整数类型有 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,其属性字段可以添加 AUTO_INCREMENT 自增约束条件。

类型名称 说明 存储需求
TINYINT 很小的整数 1个字节
SMALLINT 小的整数 2个宇节
MEDIUMINT 中等大小的整数 3个字节
INT (INTEGHR) 普通大小的整数 4个字节
BIGINT 大整数 8个字节

2.2.MySql 中的浮点数

浮点类型有两种,分别是单精度浮点数(FLOAT)和双精度浮点数(DOUBLE);定点类型只有一种,就是 DECIMAL。浮点类型和定点类型都可以用(M, D)来表示,其中M称为精度,表示总共的位数;D称为标度,表示小数的位数。浮点数类型的取值范围为 M(1~255)和 D(1~30,且不能大于 M-2),分别表示显示宽度和小数位数。M 和 D 在 FLOAT 和DOUBLE 中是可选的,FLOAT 和 DOUBLE 类型将被保存为硬件所支持的最大精度。DECIMAL 的默认 D 值为 0、M 值为 10。

类型名称 说明 存储需求
FLOAT 单精度浮点数 4 个字节
DOUBLE 双精度浮点数 8 个字节
DECIMAL (M, D),DEC 压缩的“严格”定点数 M+2 个字节

2.3.日期/时间类型

MySQL 中有多处表示日期的数据类型:YEAR、TIME、DATE、DTAETIME、TIMESTAMP。当只记录年信息的时候,可以只使用 YEAR 类型。每一个类型都有合法的取值范围,当指定确定不合法的值时,系统将“零”值插入数据库中。

类型名称 日期格式 日期范围 存储需求
YEAR YYYY 1901 ~ 2155 1 个字节
TIME HH:MM:SS -838:59:59 ~ 838:59:59 3 个字节
DATE YYYY-MM-DD 1000-01-01 ~ 9999-12-3 3 个字节
DATETIME YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 8 个字节
TIMESTAMP YYYY-MM-DD HH:MM:SS 1980-01-01 00:00:01 UTC ~ 2040-01-19 03:14:07 UTC 4 个字节

2.4.字符串类型

字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据。字符串可以区分或者不区分大小写的串比较,还可以进行正则表达式的匹配查找。MySQL 中的字符串类型有 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET 等。下表中列出了 MySQL 中的字符串数据类型,括号中的M表示可以为其指定长度。

类型名称 说明 存储需求
CHAR(M) 固定长度非二进制字符串 M 字节,1<=M<=255
VARCHAR(M) 变长非二进制字符串 L+1字节,在此,L< = M和 1<=M<=255
TINYTEXT 非常小的非二进制字符串 L+1字节,在此,L<2^8
TEXT 小的非二进制字符串 L+2字节,在此,L<2^16(64kb)
MEDIUMTEXT 中等大小的非二进制字符串 L+3字节,在此,L<2^24(16MB)
LONGTEXT 大的非二进制字符串 L+4字节,在此,L<2^32(4GB)
ENUM 枚举类型,只能有一个枚举字符串值 1或2个字节,取决于枚举值的数目 (最大值为65535)
SET 一个设置,字符串对象可以有零个或 多个SET成员 1、2、3、4或8个字节,取决于集合 成员的数量(最多64个成员)

MySql 中的Text字段的范围

TEXT:存储可变长度的非Unicode数据,最大长度为2^31-1个字符。text列不能有默认值,存储或检索过程中,不存在大小写转换,后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入。
MySql 中TEXT最大长度为65,535(2的16次方–1)字符的TEXT列。
如果你觉得text长度不够,可以选择:
MEDIUMTEXT最大长度为16,777,215。 LONGTEXT最大长度为4,294,967,295。
TEXT65,535 bytes~64kb
MEDIUMTEXT 16,777,215 bytes~16MB
LONGTEXT4,294,967,295 bytes~4GB

2.5.二进制类型

MySQL 中的二进制字符串有 BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。下表中列出了 MySQL 中的二进制数据类型,括号中的M表示可以为其指定长度。

类型名称 说明 存储需求
BIT(M) 位字段类型 大约 (M+7)/8 字节
BINARY(M) 固定长度二进制字符串 M 字节
VARBINARY (M) 可变长度二进制字符串 M+1 字节
TINYBLOB (M) 非常小的BLOB L+1 字节,在此,L<2^8
BLOB (M) 小 BLOB L+2 字节,在此,L<2^16(64kb)
MEDIUMBLOB (M) 中等大小的BLOB L+3 字节,在此,L<2^24(16MB)
LONGBLOB (M) 非常大的BLOB L+4 字节,在此,L<2^32(4GB)

3.在Django3.2中使用QuerySet基础

3.1.QuerySet的理解

在Django的Model中,QuerySet是一个很重要的概念。因为同数据库的所有查询以及更新交互都是通过它来完成的。在model中,Django通过给Model增加一个objects属性来提供数据操作统一接口。

tableQuerySet=models.ModelObj.objects.all();#获取所有对象

tableQuerySet就是一个QuerySet对象。QuerySet支持链式调用。如果每次执行都要查询数据库的话,会存在性能问题。当我们用到它时,QuerySet才会去数据库中获取数据。如下代码只执行了一次数据库查询:

tableQuerySet = models.ModelObj.objects;
available_objs = tableQuerySet.filter(status=1);
print(available_objs);

Django中的QuerySet本质上是一个懒加载的对象。以上的两行代码执行之后,都不会产生数据库查询操作,只是会返回一个QuerySet对象,等你真正用到它的时候才会执行查询。

3.2.什么是链式调用

执行一个对象中的方法之后得到的结果还是这个对象,这样可以接着执行对象上面的其他方法,这就是链式调用。

tableQuerySet = models.ModelObj.objects.filter(status=1).filter(category_id=2).filter(title__icontains="xxx");

4.QuerySet详解

从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet。

4.1.模型定义

在Django3.2中,可以通过数据库逆向生成。先用数据库管理工具创建目标数据库,然后创建目标关系表,然后采用manage.py生成mode代码,如下所示:

"C:/ZLComputeServer/Python38/python.exe" manage.py inspectdb > web/models.py

生成代码如下:

class ModeObj(models.Model):
    generatetime = models.CharField(db_column='GenerateTime', max_length=255)  # Field name made lowercase.
    pluginid = models.CharField(db_column='PluginID', primary_key=True, max_length=255)  # Field name made lowercase.
    jsxbin = models.TextField(db_column='JsxBin')  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'mode_obj'

4.2.增加数据

向数据库增加数据。

#方法1
models.ModeObj.objects.create(name="zhiliao", email="[email protected]");

#方法2
tObj = models.ModeObj(pluginid=PluginID, generatetime=GenerateTime, jsxbin=JsxBin);
tObj.save();

#方法3,首先尝试获取,不存在就创建,可以防止重复
models.ModeObj.objects.get_or_create(name="zhiliao", email="[email protected]")
# 返回值(object, True/False)

4.3.查询数据集

普通搜索目标数据。

ModeObj.objects.all()#全部对象
ModeObj.objects[0]#第一个对象
ModeObj.objects.all()[:10]#前10个对象
ModeObj.objects.all().reverse()[:2]#后两个对象
ModeObj.objects.get(name='me') # 获取name为me的对象,只能获取一个,如果有重名对象会报错
ModeObj.objects. filter(name='me') # 获取name为me的对象,可以是多个
ModeObj.objects. filter(name__iexact='me') # 获取name为me的对象,但不区分大小写
ModeObj.objects. filter(name__icontains='me') # 获取name中包含me的对象
ModeObj.objects.filter(name__regex = '^abc')  # 正则表达式查询
ModeObj.objects.exclude(name__contains = 'me')  # 排除包含me的对象
ModeObj.objects.filter(name__contains = 'me').exclude(content = 'hello')  # 找出name含有me但content不是hello的对象

迭代获取目标数据。
迭代1:

tModeObj= models.ModeObj.objects.filter(pluginid=PluginID);
    if len(tModeObj) > 0:
        firstObj = tModeObj[0];
        JsxBin=firstObj.jsxbin;#键名与模型对应
        GenerateTime=firstObj.generatetime;
        rlt={"JsxBin":JsxBin,"GenerateTime":GenerateTime};
        return rlt;
    else:
        return None;

迭代2:

items = models.ModeObj.objects.all();
for each in items:
    print(each.pluginid);

4.4.更新数据

此操作需要慎重。不可恢复。

models.ModeObj.objects.filter(name__contains="abc").update(name='xxx') # 名称中包含 "abc"的人 都改成 xxx

此操作需要慎重。不可恢复。

4.5.删除数据

models.ModeObj.objects.filter(name__contains="abc").delete() # 删除 名称中包含 "abc"的人

4.6.排序数据

models.ModeObj.objects.all().order_by('name')    #升序
models.ModeObj.objects.all().order_by('-name')   # 倒序
models.ModeObj.objects.all().order_by('-name','id')  # 链式排序

4.7.其它

如果只是检查models.ModeObj中是否有对象,应该用

models.ModeObj.objects.all().exists();

QuerySet 支持切片 models.ModeObj.objects.all()[:10] 取出10条,可以节省内存。
用 len(es) 可以得到models.ModeObj的数量,但是推荐用 models.ModeObj.objects.count()来查询数量,后者用的是SQL:SELECT COUNT(*)。
list(es) 可以强行将 QuerySet 变成列表。

5.总结

Django3.2是一款比较好用的服务器套件,本文只是简单介绍了其访问数据库部分,以及常用数据库mysql的安装和mysql字段名的含义。通过本文的阅读,读者可以在Django中简单使用mysql。

你可能感兴趣的:(Web,Django,数据库,mysql,Django,QuerySet,字段类型)