特别提醒:本人看博客园的消息还是比较少,如果对本文有疑问,可以发邮件到 shandongdxl2004@126.com 我看邮箱还是比较勤快的 :)
本文主要涉及:
- 远程的MySQL环境配置
- Python连接MySQL数据库
- 对Pymysql库的封装
- Python读写MySQL数据
系统环境:
- Windows 10 企业版 LTSC 64bit
- Python 3.6.6
- WAMP(3.0.6 32bit)集成的MySQL版本为5.7.14
1. MySQL的环境配置
如果想连接本地数据库,必须先安装MySQL服务。可以选择使用官方安装包,或者使用PHP集成环境中的数据库都可以(windows平台上的有wamp或者phpstudy)。
我这里使用的是内网其他电脑上的MySQL数据库,这就需要在数据库里开启远程访问。
1.1 启用MySQL的局域网访问
想让局域网中的所有机器都能连接MySQL数据库,首先要给MySQL开启远程连接的功能,在MySQL服务器控制台上执行MySQL命令:
1 grant all privileges on *.* to root@"%" identified by 'abc' with grant option;
2 flush privileges;
其中上面两行代码的意思是给从任意ip地址连接的用户名为root,密码为abc的用户赋予所有的权限。其中的"%"为任意的ip地址,如果想设为特定的值也可以设定为特定的值(以通配符%的内容增加主机/IP地址,也可以直接增加IP地址)
例如:
1 grant all privileges on *.* to root@"192.168.1.1" identified by 'abc' with grant option;
2 flush privileges;
这里就是指 192.168.1.1这个IP的机器可以使用 root /abc 这个账户远程访问MySQL数据库
PS:数据连接工具推荐使用Navicat,可以同时连接不同的数据库,非常方便。
我常用的是11.0.16版本 下载地址 提取码: s5kt
1.2 python环境设置
数据库配置好之后,在python里,首先要确保已经安装了pymysql,这里给出关键命令。
python -m pip install --upgrade pip
python -m pip install -U pip setuptools
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install pymysql
以上命令的含义是:
1. 更新pip
2. 更新pip的setuptools
3. 将pip的默认源设置为清华大学源
4. 安装pymysql库
2. MySQL连接库函数封装
在按照上述步骤配置了环境支持后,就可以在python使用代码连接MySQL了。
原生的用法示例:
import pymysql # IP地址、用户名、密码、数据库 db = pymysql.connect("127.0.0.1", "root", "", "test") # 使用 cursor() 方法创建一个游标对象 cursor cursor = db.cursor() # 使用 execute() 方法执行 SQL 查询 cursor.execute("SELECT VERSION()") # 使用 fetchone() 方法获取单条数据. data = cursor.fetchone()
# 打印获取的单条数据 print("Database version : %s " % data)
# 执行不需要返回值的sql(更新、插入、删除等) cursor.execute("UPDATE iplist SET ip_address='192.168.1.1' WHERE id IN('2964475','2974661','2986832');")
# 游标提交
cursor.commit()
# 关闭数据库连接
db.close()
这里给原生的库做了一个简单的封装:
import pymysql
# MySQL 操作类
class MySQL:
def __init__(self, host, user, pwd, db):
self.host = host
self.user = user
self.pwd = pwd
self.db = db
def __GetConnect(self):
"""
得到连接信息
返回: conn.cursor()
"""
if not self.db:
raise(NameError, "没有设置数据库信息")
self.conn = pymysql.connect(
host=self.host, user=self.user, password=self.pwd, database=self.db)
cur = self.conn.cursor()
if not cur:
raise(NameError, "连接数据库失败")
else:
# print('连接成功!')
return cur
def ExecQuery(self, sql):
"""
执行查询语句
返回的是一个包含tuple的list,list的元素是记录行,tuple的元素是每行记录的字段
"""
cur = self.__GetConnect()
cur.execute(sql)
rows = cur.fetchall()
resList = []
for row in rows:
resList.append(list(row)) # 每一行都转换成列表
# 查询完毕后必须关闭连接
self.conn.close()
return resList
def ExecNonQuery(self, sql):
"""
执行非查询语句
调用示例:
cur = self.__GetConnect()
cur.execute(sql)
self.conn.commit()
self.conn.close()
"""
cur = self.__GetConnect()
cur.execute(sql)
self.conn.commit() # 注意如果对数据库有修改,则必须在关闭前对游标执行commit
self.conn.close()
调用示例:
mysql_conn = MySQL(host='127.0.0.1', user="root", pwd="", db="test")
sql_string = "SELECT VERSION()"
result = mysql_conn.ExecQuery(sql_string)
print(result)
输出为:
[['5.7.14']]
至此,数据库连接成功!
3. Python对MySQL数据库的 CURD
3.1 读取MySQL数据
代码如下:
mysql_conn = MySQL(host='127.0.0.1', user="test1", pwd="123456", db="iplist") sql_string2 = "SELECT ip_address,input_date FROM iplist WHERE id IN('2964475','2974661','2986832');" result = mysql_conn.ExecQuery(sql_string2) for line in result: print(str(line)) # 打印一行 print(str(line[0]) + '____'+str(line[1])) # 打印一行中的指定元素
结果回显如下:
['192.168.59.101', '20220408'] 192.168.59.101____20220408 ['192.168.59.101', '20220408'] 192.168.59.101____20220408 ['192.168.59.101', '20220409'] 192.168.59.101____20220409
可以看到,如果直接打印其中一行,返回的是一个list。如果指定list的元素,那么就可以拿到它的值。
3.2 其他MySQL操作
所谓对数据库的 CURD,指的是:
C(Create) 增加操作,即创建表、视图等,不需要返回值
U(Update)更新操作,即修改表里的值、修改视图定义等,不需要返回值
R(Read)查询操作,即使用Selete语句查询数据库数据,需要返回值
D(Delete)删除操作,即删除表、视图等的定义,不需要返回值
在我封装的操作类中,查询操作使用 ExecQuery方法,会返回一个list,可以通过循环语句对list进行读取、处理等操作。
其他所有的不需要返回值的操作,统一使用ExecNonQuery方法,没有返回值。如果需要执行结果查看的话,需要自己再封装一个带返回值的方法。
以下是update操作的示例,其他操作用法是一样的,修改sql语句即可:
mysql_conn = MySQL(host='127.0.0.1', user="test1", pwd="123456", db="iplist") sql_string3 = "UPDATE iplist SET ip_address='192.168.1.1' WHERE id IN('2964475','2974661','2986832');" mysql_conn.ExecNonQuery(sql_string3)
执行完毕后,id为'2964475','2974661','2986832'的三条记录对应的ip_address字段就被改成'192.168.1.1'了。
示例使用的数据库创建SQL语句如下,大家可以自己搭建一个测试下效果
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for iplist -- ---------------------------- DROP TABLE IF EXISTS `iplist`; CREATE TABLE `iplist` ( `id` int(15) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键序号', `ip_address` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'ip地址', `input_date` varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '记录时间', `mac_address` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '网卡MAC地址', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 3419587 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; INSERT INTO `iplist` (`id`, `ip_address`, `input_date`, `mac_address`) VALUES (2367872, '192.168.59.101', '20220311', NULL); INSERT INTO `iplist` (`id`, `ip_address`, `input_date`, `mac_address`) VALUES (2964475, '192.168.59.101', '20220408', 'Incomplete'); INSERT INTO `iplist` (`id`, `ip_address`, `input_date`, `mac_address`) VALUES (2974661, '192.168.59.101', '20220408', 'Incomplete'); INSERT INTO `iplist` (`id`, `ip_address`, `input_date`, `mac_address`) VALUES (2982541, '192.168.59.101', '20220409', 'Incomplete'); INSERT INTO `iplist` (`id`, `ip_address`, `input_date`, `mac_address`) VALUES (2986832, '192.168.59.101', '20220409', 'Incomplete'); INSERT INTO `iplist` (`id`, `ip_address`, `input_date`, `mac_address`) VALUES (2999038, '192.168.59.101', '20220409', 'Incomplete'); INSERT INTO `iplist` (`id`, `ip_address`, `input_date`, `mac_address`) VALUES (3013347, '192.168.59.101', '20220409', 'Incomplete');
enjoy it!