数据库、TCP服务端实现协程
今日学习总结:
一、数据存放的发展
1、随意存放在一个文件中的数据,数据的格式千差万别。比如: tank|123 jason:123 sean~123
2、软件开发目录规范
Project:
conf
bin
core
db:存放一个个文件
1和2都是从本地读取数据的
3、将所有数据存放到一个第三方的公共位置,同一个软件凡是需要操作数据的,必须去这个共享的位置操作
--第三方的公共位置(数据库)
--数据库集群:将同一个数据库中的数据,复制到不同的服务器中
4、MySQL 数据库:是c/s架构软件
01.mysql数据库本质上就是一个基于网络通信的软件
02.所有基于网络通信的软件。底层都是socket
- 服务端:
- 基于网络通信
- 收发消息
- 客户端:
- 基于网络通信
- 收发消息
注意:所有语言若想操作数据库,拿到服务端ip和port,都必须遵循一套标准的解析指令,就是SQL语句,sql语句的由来,统一标准
5、数据库分类
01.关系型:MySQL postgreSQL orcale db2 sqlite sqlserver
02.非关系型:redis mongodb
二、安装数据库
1.下载mysql安装包
2.解压安装包放在D:中
3.添加系统环境变量
4.以管理员身份打开cmd,输入mysqld启动服务端,此时会卡主
- bin目录下的: mysqld.exe
5.新建一个cmd,输入mysql启动客户端连接服务端,输入mysql -h 127.0.0.1 -P 3306 -p 密码,进行登录
- mysql初始化时无密码,不需要密码,直接输入mysql,就可以写操作了。这时游客模式,功能会很少
- bin目录下的: mysql.exe
6.登录客户端
-打开cmd,输入mysql
-简写: mysql -uroot -p 密码
-全写: mysql -h 127.0.0.1 -P 3306 -p 密码
7.开启服务端
01.打开cmd,输入mysqld
02.输入 net start mysql (开启服务端mysqld)
8.退出数据库客户端
- exit; 退出
- quit; 退出
注意: SQL语句末尾必须加 “;” 号。
三、 制作系统服务(在服务端mysqld 里做以下操作)
1.必须将已启动的服务端mysqld关掉 (tasklist | findstr "mysqld" 表示查看pid号)
2.删掉已经启动过的mysqld的进程 (taskkill /F /PID pid号 表示结束服务端mysqld进程)
3.输入 mysqld --install (安装mysqld系统服务)
4.输入 net start mysql (开启服务端mysqld)
四、cmd 中操作语句
1、查看操作系统中是否已经启动mysqld 服务端 得到pid号
- tasklist | findstr "mysqld"
2、杀死mysqld进程
- taskkill /F /PID + pid号
注意:做服务端操作时,必须先以管理员身份打开
五、设置配置文件:
1.先在mysql目录下 --》 D:\mysql-5.6.40-winx64
2.创建一个名为 “my.ini” 的文件,这个是mysql的配置文件,里面用的xml的语法 写配置
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client] # 这个是用python软件连接的客户端
default-character-set=utf8
[mysql] # mysql软件的客户端
# 可写,可不写这样可以不需要用户名与密码直接登录mysql
# user='root'
# password=123
default-character-set=utf8 # 设置默认的字符编码
3.重启mysql服务,即修改成功!
六、修改、设置密码:
- mysql -u 登录mysql用户名(root) -p 密码
- 默认自带 root 超级用户, 没有密码
1、管理员登录
- mysql -uroot 回车进入
2、游客登录
- mysql 回车
3、修改密码:
01 - 默认没有密码的情况下,设置密码
- cmd>>>: mysqladmin -uroot password 123
02- 有密码的情况下,修改密码
- cmd>>>: mysqladmin -uroot -p原密码 password修改的密码
- cmd>>>: mysqladmin -uroot -p123 password 123456
4、破解密码: 当密码忘记时采用
01.关闭服务端
02.跳过权限启动服务端
- cmd>>>: mysqld --skip-grant-tables
03.客户端进入游客模式:
- cmd>>>: mysql
- cmd>>>: update mysql.user set password=password('123456') where user="root";
解释:- update mysql库.user表名 set 字段password=字段password('字段值') where 条件(若条件成立,则修改)user="root";
04.重新启动服务端,不要跳过权限认证
- 先kill掉跳过权限认证启动的服务端进程
- 再手动去开服务中的mysql服务即可
七、数据库基本操作:
1、 查看所有数据库:
- show databases;
2、库的操作 ---> 类似于文件夹
- 增:
语法: create database 库名;
- create database db1; # 创建一个数据库
- 查
语法: show databases; # 查看所有库
show create database db1; # 查看db1库中的信息
- 改
语法: alter database 库名 charset="字符编码类型";
- alter database db1 charset="utf8";
- 删
语法: drop database db1;
3、表的操作 ---> 类似于文件
- 操作表前,需要先切换到指定库
语法: use 库名;
- use db1;
- 查看当前所在的库: select database;
- 增:varchar与char 都是字符串类型;varchar(20)
语法: create table 表名(字段名 字段类型);
create table user_info(name varchar(20), age int);
- 查
语法:show tables; # 查看当前库中所有的表
语法:desc user_info; # 查看表结构
- 改
语法: alter table 表名 modify name varchar(28);
- alter table user_info modify name varchar(28);
- 删
语法: drop table 表名;
- create table test(id int);
- drop table test;
4、记录 的操作 ---> 类似于文件中的一行行数据
- 增:
语法: insert into 表名 values('字段类型的数据1', 字段类型的数据2);
- insert into user_info values('tank', 17); #插入一条数据
- insert into user_info values('jason', 71), ('sean', 78); #插入多条数据
- 查:
语法: select * from 表名; # 查看表中所有的数据,*: 指的是所有
- select * from user_info;
- select * from 表名 where 条件; # 条件成立则查看成功!
- select * from user_info where name="tank"; # 查看name 字段为 tank 的记录
- select age from user_info where name="tank"; # 查看name 字段为 tank 的age字段
- select name from user_info; # 查看所有的名字:
- 改
语法: update 表名 set 字段名=字段值 where 条件判断; # 若条件成立,则修改成功!
- update user_info set name='handsome' where age=17; # 修改age为17的记录中name属性为 handsome
- update user_info set name='d_sb' where age>16; # 修改age>16的记录 中name属性为 d_sb
- 删
语法: delete from 表名;
- delete from user_info; # 清空表记录,不提交,可恢复。
-delete from user_info where age=17;
语法: truncate table 表名;
- truncate table user_info; # 删除,不可恢复
八、TCP服务端实现协程
client 文件 from threading import Thread, current_thread import socket def send_get_msg(): # 向服务端发送或接受数据 client = socket.socket() client.connect(('127.0.0.1', 9999)) while True: client.send(f'{current_thread().name}'.encode('utf-8')) # 发送数据 #current_thread是一个方法,可以获取线程的名字:用current_thread().name data = client.recv(1024) # 接收数据 print(data.decode('utf-8')) # 模拟100个用户访问服务端 if __name__ == '__main__': list1 = [] for line in range(100): t = Thread(target=send_get_msg) t.start() list1.append(t) for t in list1: t.join()
server文件 from gevent import monkey; monkey.patch_all() from gevent import spawn import socket server = socket.socket() server.bind(('127.0.0.1', 9999)) server.listen(5) # 与客户端通信 def working(conn): while True: try: data = conn.recv(1024) #接收数据 if len(data) == 0: break print(data.decode('utf-8')) conn.send(data.upper()) #发送数据 except Exception as e: print(e) break conn.close() # 与客户端连接 def run(server): # server 是对象参数 while True: # 反复的建立通道 conn, addr = server.accept() print(addr) spawn(working, conn) #spawn是Greenlet类中的spawn方法。def spawn(cls, *args, **kwargs): if __name__ == '__main__': print('服务端已启动...') g = spawn(run, server) # spawn(函数名,参数1,参数2) g.join()

浙公网安备 33010602011771号