山东喵

导航

 

 


特别提醒:本人看博客园的消息还是比较少,如果对本文有疑问,可以发邮件到 shandongdxl2004@126.com   我看邮箱还是比较勤快的 :)


本文主要涉及:

  1. 远程的MySQL环境配置
  2. Python连接MySQL数据库
  3. 对Pymysql库的封装
  4. 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!

 

 

特别提醒:本人看博客园的消息还是比较少,如果对本文有疑问,可以发邮件到 shandongdxl2004@126.com   我看邮箱还是比较勤快的 :)


 

posted on 2022-04-20 10:12  山东喵  阅读(5426)  评论(0编辑  收藏  举报