文章目录
- 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="18928899728@163.com");
#方法2
tObj = models.ModeObj(pluginid=PluginID, generatetime=GenerateTime, jsxbin=JsxBin);
tObj.save();
#方法3,首先尝试获取,不存在就创建,可以防止重复
models.ModeObj.objects.get_or_create(name="zhiliao", email="18928899728@163.com")
# 返回值(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。