• Python——如何使用python连接MySQL数据库


     


    特别提醒:本人看博客园的消息还是比较少,如果对本文有疑问,可以发邮件到 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   我看邮箱还是比较勤快的 :)


  • 相关阅读:
    codevs1288 埃及分数
    [BZOJ1697][Usaco2007 Feb]Cow Sorting牛排序
    [BZOJ1628][Usaco2007 Demo]City skyline
    [Usaco2005 Mar]Out of Hay 干草危机
    [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
    [BZOJ1691][Usaco2007 Dec]挑剔的美食家
    [BZOJ1668][Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富
    [BZOJ1593][Usaco2008 Feb]Hotel 旅馆
    [BZOJ1637][Usaco2007 Mar]Balanced Lineup
    [BZOJ1650][Usaco2006 Dec]River Hopscotch 跳石子
  • 原文地址:https://www.cnblogs.com/shandongmiao/p/16168691.html
Copyright © 2020-2023  润新知