Python3 Socket + Mysql的使用 - 基础案例
前言
小白个人研究成果,仅供参考
一、下载安装Mysqldb
python3 直接cmd运行
pip3 install Mysqlclien
二、代码部分
想要的结果:客户端调用服务端,获取到数据库数据
1.Socket服务端
准备工作做好后,我们准备服务端 server.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
import MySQLdb
# 服务端
if __name__ == '__main__':
# 创建socket对象
sock = socket.socket()
# 获取本地主机名
hostName = socket.gethostname()
# 设置端口号
prot = 8081
# 绑定主机和端口
sock.bind((hostName, prot))
# 设置等待时间
sock.listen(10)
# 连接数据库(ip, 用户名, 密码, 数据库名, 编码)
conn = MySQLdb.connect('127.0.0.1', 'root', '123456', 'Demo', charset='utf8')
# 获取操作游标
cursor = conn.cursor()
cursor.execute('select * from class')
data = cursor.fetchall()
while True:
# 获取客户端请求
clientSock, address = sock.accept()
print('连接地址:%s' % address[0])
# 获取客户端消息
clientMsg = clientSock.recv(1024).decode()
if '钱' in clientMsg:
msg = '当前网络差,连接失败~'
else:
# 以[{},{}]格式返回给客户端
msg = data
# 向客户端发送消息
clientSock.send(str(msg).encode())
# 关闭连接
clientSock.close()
conn.close()
2.Socket客户端
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
# 客户端
if __name__ == '__main__':
# 创建socket连接对象
sock = socket.socket()
# 获取服务端主机名(我这里是本地)
serverHostName = socket.gethostname()
# 连接服务端
sock.connect((serverHostName, 8081))
msg = '我要*钱。'
msg = '我要数据'
# 向服务端发送消息
sock.send(bytes(msg, encoding='utf8'))
# 接受服务端消息
serverMsg = sock.recv(1024).decode()
# 返回的数据是((),())格式的,所以我这边用比较蠢笨的方法去获取单个数据
# 去掉首尾的(())
msg = serverMsg[2:len(serverMsg)-2]
# 根据), (分割数据
msg = msg.split('), (')
# 提取出单条数据
for index in range(len(msg)):
data = msg[index].split(',')
print('班级名称:%s,班级编号:%s,班主任:%s' % (data[1], data[2], data[3]))
# 关闭连接
sock.close()
pass
数据库基本操作示例
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import MySQLdb # python3安装命令:pip3 install Mysqlclien
if __name__ == '__main__':
# 连接数据库(ip, 用户名, 密码, 数据库名, 编码)
conn = MySQLdb.connect('127.0.0.1', 'root', '123456', 'demo', charset='utf8')
# 获取操作游标
cursor = conn.cursor()
try:
# 执行建表操作 - 先判断删除已存在的表再执行新建操作
cursor.execute('DROP TABLE IF EXISTS class')
createSql = """CREATE TABLE `class` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`code` varchar(255) DEFAULT NULL,
`teacher` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4"""
cursor.execute(createSql)
# 插入数据
cursor.execute("INSERT INTO `demo`.`class` (`name`, `code`, `teacher`) VALUES ('一年级一班', '20210901', '张秀梅')")
cursor.execute("INSERT INTO `demo`.`class` (`name`, `code`, `teacher`) VALUES ('一年级(2)班', '20210903', '姚婷')")
# 获取新增数据的ID (需在commit前调用)
firstId = conn.insert_id()
insertSql = "INSERT INTO `demo`.`class` (`name`, `code`, `teacher`) VALUES ('%s', '%s', '%s')" % ('一年级(3)班', '20210902', '胡启秀')
cursor.execute(insertSql)
# 获取最后一条新增数据的ID
lastId = cursor.lastrowid
# 提交数据
conn.commit()
# 修改数据
cursor.execute("UPDATE `demo`.`class` SET `name` = '%s' WHERE (`id` = '%s')" % ('一年级(1)班', firstId))
conn.commit()
# 删除数据
cursor.execute('DELETE FROM class WHERE id = %d' % lastId)
print("删除操作中受影响的行数:", cursor.rowcount)
conn.commit()
# 查询数据
cursor.execute('SELECT * FROM class')
datas = cursor.fetchall()
for data in datas:
print("ID:%d" % (data[0]))
for index in range(len(data)):
print(data[index])
except Exception as e:
# 回滚事物
conn.rollback()
print('操作异常:', e)
finally:
# 关闭数据库
conn.close()
pass
总结
又是小白努力向上的一天!有不足之处欢迎指出。
本文参考自:https://www.runoob.com/python/python-socket.html