python&&mysql
mysql 引入

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- <link rel="stylesheet" href="/static/js/jquery-3.6.0.min.js">-->
<link rel="stylesheet" href="/static/plugins/bootstrap-3.4.1/css/bootstrap.css">
</head>
<body>
<div class="navbar navbar-default">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="#">
<img alt="Brand" width="20" height="20"
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAB+0lEQVR4AcyYg5LkUBhG+1X2PdZGaW3btm3btm3bHttWrPomd1r/2Jn/VJ02TpxcH4CQ/dsuazWgzbIdrm9dZVd4pBz4zx2igTaFHrhvjneVXNHCSqIlFEjiwMyyyOBilRgGSqLNF1jnwNQdIvAt48C3IlBmHCiLQHC2zoHDu6zG1iXn6+y62ScxY9AODO6w0pvAqf23oSE4joOfH6OxfMoRnoGUm+de8wykbFt6wZtA07QwtNOqKh3ZbS3Wzz2F+1c/QJY0UCJ/J3kXWJfv7VhxCRRV1jGw7XI+gcO7rEFFRvdYxydwcPsVsC0bQdKScngt4iUTD4Fy/8p7PoHzRu1DclwmgmiqgUXjD3oTKHbAt869qdJ7l98jNTEblPTkXMwetpvnftA0LLHb4X8kiY9Kx6Q+W7wJtG0HR7fdrtYz+x7iya0vkEtUULIzCjC21wY+W/GYXusRH5kGytWTLxgEEhePPwhKYb7EK3BQuxWwTBuUkd3X8goUn6fMHLyTT+DCsQdAEXNzSMeVPAJHdF2DmH8poCREp3uwm7HsGq9J9q69iuunX6EgrwQVObjpBt8z6rdPfvE8kiiyhsvHnomrQx6BxYUyYiNS8f75H1w4/ISepDZLoDhNJ9cdNUquhRsv+6EP9oNH7Iff2A9g8h8CLt1gH0Qf9NMQAFnO60BJFQe0AAAAAElFTkSuQmCC">
</a>
</div>
</div>
</div>
<div class="container">
<h3>{{title}}</h3>
<table class="table table-bordered">
<thead>
<tr>
<th>#</th>
<th>First Name</th>
<th>Last Name</th>
<th>Username</th>
</tr>
</thead>
<tbody>
{% for item in data_list%}
<tr>
<th scope="row">1</th>
<td>{{item}}</td>
<td>Otto</td>
<td>@mdo</td>
</tr>
{% endfor %}
<!-- <tr>-->
<!-- <th scope="row">1</th>-->
<!-- <td>Mark</td>-->
<!-- <td>Otto</td>-->
<!-- <td>@mdo</td>-->
<!-- </tr>-->
<!-- <tr>-->
<!-- <th scope="row">2</th>-->
<!-- <td>Jacob</td>-->
<!-- <td>Thornton</td>-->
<!-- <td>@fat</td>-->
<!-- </tr>-->
<!-- <tr>-->
<!-- <th scope="row">3</th>-->
<!-- <td>Larry</td>-->
<!-- <td>the Bird</td>-->
<!-- <td>@twitter</td>-->
<!-- </tr>-->
</tbody>
</table>
</div>
<script src="/static/plugins/bootstrap-3.4.1/js/bootstrap.js"></script>
</body>
</html>

能做数据的存储:txt文件 excel文件但是效果不高
专业存储数据的软件:数据库管理系统
- mysql oracle sqlserver DB2 Access
mysql 概要

安装mysql

我们实验用5.7.31 版本的
下载
官方网站 https://downloads.mysql.com/archives/community/
注windows 安装的话,还需要安装补丁,并且先安装

windows 安装补丁
安装

这个 是一个免安装版本,直接解压,并放到一个目录。(不要有中文路径)

创建配置文件
注:放在mysql 解压后的目录下

初始化
- 打开终端,并且以管理员的权限运行
- 输入初始化的命令

注:加引号是命令中可能有空格,初始完后会在目录下面生成一个data的目录

启动mysql
有两种方式 1. 临时启动 2. 制作成windows服务
临时启动

注:不推荐,黑框不能关,如果关了,mysql服务就停了
制作mysql windows服务

命令服务操作

连接测试




设置密码

set password = password("root123");
查看已有的数据库

退出
exit;
忘记密码
-
关闭mysql 服务
-
修改配置文件,改为无帐号启动模式

-
重新启动
-
登陆修改为新密码

-
取消无帐号模式,再重新启动
mysql 指令
| Mysql | 认知 |
|---|---|
| 数据库 | 文件夹 |
| 数据表 | 文件(excel文件) |
数据库管理(文件夹)
show databases; #查看数据库命令
create database 数据库名 default charset utf8 COLLATE utf8_general_ci; # 创建数据库
drop database;数据库名 #删除数据库
use 数据库名字; #进入数据库
show tables; # 查看数据库中的数据表
数据表的管理(文件)
show databases;
use 数据库;
show tables;
create table 表名称(
列名称 类型,
列名称 类型,
列名称 类型,
) default charset=utf8;
create table tb1(
id int,
name varchar(16),
age int
) default charset=utf8;
create table tb1(
id int,
name varchar(16) not null, #不允许为空
age int null default 3 #默认值为3 允许为空
) default charset=utf8;
create table tb1(
id int primary key, #主键(不允许为空,不能重复)
name varchar(16),
age int
) default charset=utf8;
主键一般用于当前行的数据编号,类似于身份证号码。
create table tb1(
id int auto_increment primary key, #内部维护自增
name varchar(16),
age int
) default charset=utf8;
一般情况下创建表时都这样来写

mysql 数据表常用的数据类型
- tinyint
有符号:0~255
无符号:-128~127
默认是有符号的,设置无符号时看下面语句
- int
有符号:-2147483648~2147483647
无符号:0~2147483647
- bigint
有符号:-9223372036854775808~9223372036854775807
无符号:0~18446744073709551615
练习
# 创建数据表
create table tb2(
id bigint not null auto_increment primary key,
salary int, -- test
age tinyint
) default charset=utf8;
# 插入数据
insert into tb2(salary,age) values(10000,18);
insert into tb2(salary,age) values(20000,28),(40000,40);

- float
- double
- decimal
准确的小数值,m是数数总个数(负号不算),d是小数点后面的个数,m最大值为65,d最大值为30
例如
system clear --数据库里面清屏
create table tb3(
id bigint not null auto_increment primary key,
salary decimal(8,2) -- 数据总共8位,小数点后占两位
) default charset=utf8;

注:超过小数位数为四舍五入
- char
定长字符串 查询速度快 固定长度一般用,比如密码 手机号
最多可容纳255个字符
char(11) 固定用11个字符进行存储,哪怕没有11个字符,也会占用11个字符进行存储
create table tb4(
id int not null auto_increment primary key,
mobile char(11)
) default charset=utf8;
- varchar 节省空间
变长字符串
最大65535个字节,如果是中文的话为65535/3
create table tb5(
id int not null auto_increment primary key,
mobile varchar(11)
) default charset=utf8;
- text
可容纳65535个字符,
create table tb6(
id int not null auto_increment primary key,
content text
) default charset=utf8;
- mediumtext

- longtext

- datetime

- date

练习题:用户表
## 创建表
create table tb7(
id int not null primary key auto_increment,
name varchar(64) not null,
password char(64) not null,
age tinyint,
salary decimal(10,2),
ctime datetime
) default charset=utf8;
insert into tb7(name,password,age,salary,ctime) values("lifei","lifei","35","1000.3","2023-11-08 10:03:00");

其它数据类型

我们开发系统时
创建数据库和表结果都是通过表结构进行创建的
数据行操作
1.新增数据

2. 删除数据

3. 修改数据

4. 查询数据

小结

案例 员工管理
- 使用mysql 内置工具(命令)
- 创建数据库:unicom
- 创建数据表:admin
id,整型,自增,主键
username 字符串,不为空
password 字符串,不为空
mobile 字符串,不为空
create database unicom default charset utf8 COLLATE utf8_general_ci;
create table admin(
id int not null primary key auto_increment,
username varchar(64) not null,
password char(64) not null,
mobile char(11) not null
) default charset=utf8;
- python 代码实现注册:
- 注册用户
- 删除用户
- 查看用户
- 更新用户信息
依赖于第三方模块 pymysql
pip install pymysql
新增数据
import pymysql
# 连接mysql
conn=pymysql.connect(host="127.0.0.1",user="root",password="123456",charset="utf8",db="unicom")
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
# 发送指令
cursor.execute("insert into admin(username,password,mobile) values('lifei','lifei','18988888888')")
conn.commit()
# 关闭连接
cursor.close()
conn.close()
动态插入数据的正确做法
import pymysql
# 连接mysql
conn=pymysql.connect(host="127.0.0.1",user="root",password="123456",charset="utf8",db="unicom")
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
# 发送指令
# 千万别用字符串格式做去做拼接,有安全隐患容易被sql注入
# sql="insert into admin(username,password,mobile) values(%s,%s,%s)"
# cursor.execute(sql,['葛爱清','zhaobo','18888888888'])
sql="insert into admin(username,password,mobile) values(%(n1)s,%(n2)s,%(n3)s)"
cursor.execute(sql,{"n1":"zhaobo","n2":"123","n3":"16666666666"})
conn.commit()
# 关闭连接
cursor.close()
conn.close()

查询数据
import pymysql
# 连接mysql
conn=pymysql.connect(host="127.0.0.1",user="root",password="123456",charset="utf8",db="unicom")
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
# 执行查询指令
# sql="insert into admin(username,password,mobile) values(%s,%s,%s)"
# cursor.execute(sql,['葛爱清','zhaobo','18888888888'])
cursor.execute("select * from admin where id<%s",[10])
# datalist=cursor.fetchone() 获取符合条件的第一条数据
datalist=cursor.fetchall() #获取符合条件的所有数据
print(datalist)
# conn.commit()
for rowdict in datalist:
print(rowdict)
# 关闭连接
cursor.close()
conn.close()
删除数据
import pymysql
# 连接mysql
conn=pymysql.connect(host="127.0.0.1",user="root",password="123456",charset="utf8",db="unicom")
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
# 发送指令
# 千万别用字符串格式做去做拼接,有安全隐患容易被sql注入
# sql="insert into admin(username,password,mobile) values(%s,%s,%s)"
# cursor.execute(sql,['葛爱清','zhaobo','18888888888'])
cursor.execute("delete from admin where id=%s",[105])
conn.commit()
# 关闭连接
cursor.close()
conn.close()
修改数据
import pymysql
# 连接mysql
conn=pymysql.connect(host="127.0.0.1",user="root",password="123456",charset="utf8",db="unicom")
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
# 发送指令
# 千万别用字符串格式做去做拼接,有安全隐患容易被sql注入
# sql="insert into admin(username,password,mobile) values(%s,%s,%s)"
# cursor.execute(sql,['葛爱清','zhaobo','18888888888'])
cursor.execute("update admin set mobile=%s where id=%s",['14088888888','114'])
conn.commit()
# 关闭连接
cursor.close()
conn.close()

案例:flask + mysql
配置文件截图

app.py
from flask import Flask,render_template,request
import pymysql
app=Flask(__name__)
@app.route("/show/user")
def show_user():
conn = pymysql.connect(host="127.0.0.1", passwd="123456", port=3306, user="root", db="unicom", charset="utf8")
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("select * from admin")
data_list = cursor.fetchall()
cursor.close()
conn.close()
return render_template("show_user.html",data_list=data_list)
@app.route("/add/user",methods=['GET','POST'])
def add_user():
if request.method=='GET':
return render_template("add_user.html")
print(request.form)
username=request.form.get("user")
password=request.form.get("pwd")
mobile=request.form.get("mobile")
# 连接mysql
conn=pymysql.connect(host="127.0.0.1",passwd="123456",port=3306,user="root",db="unicom",charset="utf8")
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
print(username, password, mobile)
# 拼接mysql
# sql = "insert into admin(username,password,mobile) values(%(n1)s,%(n2)s,%(n3)s)"
# cursor.execute(sql, {"n1": "zhaobo", "n2": "123", "n3": "16666666666"})
cursor.execute('insert into admin(username,password,mobile) values(%s,%s,%s)', [username, password, mobile])
conn.commit()
# 关闭连接
cursor.close()
conn.close()
return "添加成功"
if __name__ == '__main__':
app.run()
add_user.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>增加帐号</title>
</head>
<body>
<h1>添加用户</h1>
<form method="post" action="/add/user">
<input type="text" name="user" placeholder="用户名">
<input type="text" name="pwd" placeholder="密码">
<input type="text" name="mobile" placeholder="手机号">
<input type="submit" value="提 交">
</form>
</body>
</html>
show_user.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/plugins/bootstrap-3.4.1/css/bootstrap.css"></link>
</head>
<body>
<h1 style="text-align: center;width: 100%;display: inline-block">用户信息查看</h1>
<div class="container">
<table class="table table-bordered">
<thead>
<tr>
<th>用户名</th>
<th>密码</th>
<th>手机号</th>
</tr>
</thead>
<tbody>
{% for item in data_list %}
<tr>
<td>{{item.id}}</td>
<td>{{item.username}}</td>
<td>{{item.password}}</td>
<td>{{item.mobile}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</body>
</html>


浙公网安备 33010602011771号