返回列表 发帖

Python3脚本管理Linux下的MySQL

笺注:这是在 CentOS6.9编译安装Zabbix4.4.5 的基础上进行的。


操作系统的版本信息:
[root@Zabbix_server_01 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@Zabbix_server_01 ~]#
[root@Zabbix_server_01 ~]# uname -r
2.6.32-696.el6.x86_64


Python的安装可参考:CentOS6安装Python3

Python的版本信息:
[root@Zabbix_server_01 ~]# python3 --version
Python 3.6.8


MySQL的版本信息:
[root@Zabbix_server_01 ~]# mysql -V
mysql  Ver 14.14 Distrib 5.5.48, for Linux (x86_64) using readline 5.1


登录MySQL后,修改数据库管理员root@localhost的密码:
use mysql;
UPDATE user SET Password = password ( '888' ) WHERE User = 'root';
flush privileges;

图片1.png


查看之前已经创建好的库zabbix:
mysql> show create database zabbix;
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| zabbix   | CREATE DATABASE `zabbix` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.00 sec)

注释:库zabbix的字符集是 utf8_general_ci



######

MySQL服务器连接公网安装第三方库(PyMySQL):(可以指定软件的版本)
[root@Zabbix_server_01 ~]# pip3 install PyMySQL==0.10.1 -i http://mirrors.aliyun.com/pypi/simple --trusted-host=mirrors.aliyun.com
Looking in indexes: http://mirrors.aliyun.com/pypi/simple
Collecting PyMySQL==0.10.1
  Downloading http://mirrors.aliyun.com/pypi/packages/1a/ea/dd9c81e2d85efd03cfbf808736dd055bd9ea1a78aea9968888b1055c3263/PyMySQL-0.10.1-py2.py3-none-any.whl (47kB)
    100% |████████████████████████████████| 51kB 542kB/s
Installing collected packages: PyMySQL
Successfully installed PyMySQL-0.10.1
[root@Zabbix_server_01 ~]#

由此还可以获得软件包的下载地址:(需要另外手动下载软件包)
[root@Zabbix_server_01 ~]# wget http://mirrors.aliyun.com/pypi/packages/1a/ea/dd9c81e2d85efd03cfbf808736dd055bd9ea1a78aea9968888b1055c3263/PyMySQL-0.10.1-py2.py3-none-any.whl

备注:这个软件包不区分32、64位,并且是Windows、Linux系统通用的。


查看PyMySQL的版本:(不同版本在使用上可能会有所差异)
[root@Zabbix_server_01 ~]# pip3 freeze
PyMySQL==0.10.1
[root@Zabbix_server_01 ~]#


笺注:假如只是在远程客户端通过Python3脚本管理MySQL数据库,那么MySQL服务器连Python3都不需要安装。





######

例子一:
MySQL服务器本地测试与数据库连接的脚本:(/root/xx.py)
[root@Zabbix_server_01 ~]# cat xx.py
#coding=utf-8
import pymysql

def db_connect():

        #连接数据库;使用数据库管理员root@localhost,即在服务器本地进行管理
        db = pymysql.connect("localhost", "root", "888", "mysql",3306,charset="utf8") #库“mysql”是默认就存在的
       
        cursor = db.cursor()
       
        Sql_1 = "select version();" #查看MySQL的版本信息
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchone() #使用fetchone只能获取一个元素
       
        print(Result_1)
        print(type(Result_1))
       
        print("-" * 10)
        print(Result_1[0]) #输出元组的第一个元素
        print(type(Result_1[0]))
       
        print("-" * 10)
        Result_2 = Result_1[0][:-4] #去掉最后4个字符
        print(Result_2)
        print(f"数据库的版本信息:{Result_2}")
       
        db.close() #关闭数据库连接

def func_main():
        try:
                db_connect()
        except Exception as e:
                print(f"数据库连接失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:(连接成功时)
[root@Zabbix_server_01 ~]# python3 xx.py
('5.5.48-log',)
<class 'tuple'>
----------
5.5.48-log
<class 'str'>
----------
5.5.48
数据库的版本信息:5.5.48
[root@Zabbix_server_01 ~]#


脚本运行的结果:(因用户密码错误,连接失败时)
[root@Zabbix_server_01 ~]# python3 xx.py
数据库连接失败,原因: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
[root@Zabbix_server_01 ~]#





############

例子二:
MySQL服务器本地查看某个库的大小的脚本:
[root@Zabbix_server_01 ~]# cat xx.py
#coding=utf-8
import pymysql

def db_connect():
        db = pymysql.connect("localhost", "root", "888", "mysql",3306,charset="utf8")
        cursor = db.cursor()
       
        Sql_1 = "select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from information_schema.TABLES where table_schema = 'zabbix'" #查看库zabbix的大小。
        cursor.execute(Sql_1)
        Result_1 = cursor.fetchone()
        print(Result_1)
        print(type(Result_1))

        print(Result_1[0]) #输出元组的第一个元素
        print(type(Result_1[0]))
       
        print("-" * 10)
        Result_2 = Result_1[0][:-2] #去掉最后2个字符
        print(Result_2)
        print(type(Result_2))
       
        Result_2 = float(Result_2)
        print(Result_2)
        print(type(Result_2))
       
        db.close()

def func_main():
        try:
                db_connect()
        except Exception as e:
                print(e)

if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@Zabbix_server_01 ~]# python3 xx.py
('9.25MB',)
<class 'tuple'>
9.25MB
<class 'str'>
----------
9.25
<class 'str'>
9.25
<class 'float'>
[root@Zabbix_server_01 ~]#





######

MySQL服务器再授权数据库用户zhuohua@'192.168.168.132'(密码1234),仅仅在使用IP地址192.168.168.132时可以进行访问,对库zabbix有完全控制的权限:
mysql> grant all on zabbix.* to zhuohua@'192.168.168.132' identified by '1234';

查看数据库用户zhuohua@'192.168.168.132'的权限:
mysql> show grants for zhuohua@'192.168.168.132';
+----------------------------------------------------------------------------------------------------------------------+
| Grants for zhuohua@192.168.168.132                                                                                   |
+----------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'zhuohua'@'192.168.168.132' IDENTIFIED BY PASSWORD '*A4B6157319038724E3560894F7F932C8886EBFCF' |
| GRANT ALL PRIVILEGES ON `zabbix`.* TO 'zhuohua'@'192.168.168.132'                                                    |
+----------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql>



MySQL服务器的防火墙配置:(打开TCP 3306端口)
[root@Zabbix_server_01 ~]# iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
[root@Zabbix_server_01 ~]# iptables-save > /etc/sysconfig/iptables





############
############

例子三:
Win7客户端远程测试与数据库的连接的脚本:(C:\Users\jacky\Desktop\xx.py)

#coding=utf-8
import pymysql

def db_connect():

        #连接数据库;MySQL服务器的IP地址(192.168.168.130)、用户名、用户密码、其中一个库的名称(zabbix)、端口号、字符集
        db = pymysql.connect("192.168.168.130", "zhuohua", "1234", "zabbix",3306,charset="utf8")
       
        cursor = db.cursor()
       
        Sql_1 = "select version();"
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchone()
       
        Result_2 = Result_1[0][:-4] #去掉最后4个字符
        print(Result_2)
        print(f"数据库的版本信息:{Result_2}")
       
        db.close()

def func_main():
        try:
                db_connect()
        except Exception as e:
                print(f"数据库连接失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:(连接成功时)
C:\Users\jacky\Desktop>python xx.py
5.5.48
数据库的版本信息:5.5.48

C:\Users\jacky\Desktop>


脚本运行的结果:(因MySQL服务器的IP地址错误,连接失败时)
C:\Users\jacky\Desktop>python xx.py
数据库连接失败,原因: (2003, "Can't connect to MySQL server on '192.168.168.130' (timed out)")

C:\Users\jacky\Desktop>





############

例子四:
Win7客户端远程查看某个库的大小的脚本:

#coding=utf-8
import pymysql

def db_connect():
        db = pymysql.connect("192.168.168.130", "zhuohua", "1234", "zabbix",3306,charset="utf8")
        cursor = db.cursor()
       
        Sql_1 = "select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from information_schema.TABLES where table_schema = 'zabbix'" #查看库zabbix的大小。
        cursor.execute(Sql_1)
        Result_1 = cursor.fetchone()
       
        print(Result_1[0])
        print(f"库zabbix的大小为{Result_1[0]}")
       
        db.close()

def func_main():
        try:
                db_connect()
        except Exception as e:
                print(e)

if __name__ == "__main__":

        func_main()


脚本运行的结果:
C:\Users\jacky\Desktop>python xx.py
9.39MB
库zabbix的大小为9.39MB

C:\Users\jacky\Desktop>





######

例子五:
Win7客户端远程创建表的脚本:

#coding=utf-8
import pymysql

def create_table():

        db = pymysql.connect("192.168.168.130", "zhuohua", "1234", "zabbix",3306,charset="utf8")        
        cursor = db.cursor()
       
        #创建表table1,字段id会自动增长;这是在库zabbix中创建表
        Sql_1 = """CREATE TABLE table1 (
                id int not null auto_increment,
                name varchar(20) NOT NULL,
                math decimal(50,2),
                address text,shijian datetime,
                primary key(id)
                )""" #SQL语句
       
        cursor.execute(Sql_1) #执行SQL语句       
        db.close()
               
def func_main():
        try:
                create_table()
        except Exception as e:
                print("创建表失败,原因: %s" % e)
        else:
                print("创建表成功。")
               
if __name__ == "__main__":

        func_main()


脚本运行的结果:(创建表成功时)
C:\Users\jacky\Desktop>python xx.py
创建表成功。

C:\Users\jacky\Desktop>


脚本运行的结果:(因表table1已经存在,创建失败时)
C:\Users\jacky\Desktop>python xx.py
创建表失败,原因: (1050, "Table 'table1' already exists")

C:\Users\jacky\Desktop>


在MySQL服务器本地查看库zabbix中的表table1的表结构:
[root@Zabbix_server_01 ~]# mysql -u"root" -p"888" -e "use zabbix;desc table1;"
图片2.png





######

例子六:
Win7客户端远程一次性插入多条记录的脚本:

#coding=utf-8
import pymysql

import datetime
dt = datetime.datetime.now()
tt_1 = dt.strftime('%Y-%m-%d %H:%M:%S') #当前时间

def insert_record():
        global db
        db = pymysql.connect("192.168.168.130", "zhuohua", "1234", "zabbix",3306,charset="utf8")
        cursor = db.cursor()
       
        Sql_1 = "INSERT INTO table1(name,math,address,shijian)" \
        " VALUES('李大杰',18,'guangzhou','2019-9-9 7:9:18')"        
        cursor.execute(Sql_1)
       
        Key_1 = '范小冰'
        Key_2 = 28
        Key_3 = 'foshan'
        Key_4 = '2019-10-08 05:06:08'
       
        Sql_2 = f"INSERT INTO table1(name,math,address,shijian) VALUES('{Key_1}',{Key_2},'{Key_3}','{Key_4}')"
        cursor.execute(Sql_2)

        Key_1 = 'zhuohua'
        Key_2 = 38.5
        Key_3 = 'zhuhai'
        Key_4 = tt_1
       
        Sql_3 = f"INSERT INTO table1(name,math,address,shijian) VALUES('{Key_1}',{Key_2},'{Key_3}','{Key_4}')"
        cursor.execute(Sql_3)
               
        db.commit() #把执行任务提交到数据库;必须是所有SQL语句都执行成功才会提交
        db.close()
               
def func_main():
        try:
                insert_record()
        except Exception as e:
                print(f"插入记录失败,原因: {e}")
                db.rollback() #如果发生错误就回滚
        else:
                print("插入记录成功。")
               
if __name__ == "__main__":

        func_main()


脚本运行的结果:
C:\Users\jacky\Desktop>python xx.py
插入记录成功。

C:\Users\jacky\Desktop>


在MySQL服务器本地查看库zabbix中的表table1的表数据:
[root@Zabbix_server_01 ~]# mysql -u"root" -p"888" -e "use zabbix;select * from table1;"
图片3.png





######

例子七:
Win7客户端远程输出数据库中某个表的所有记录的脚本:

#coding=utf-8
import pymysql

def query_data():
        db = pymysql.connect("192.168.168.130", "zhuohua", "1234", "zabbix",3306,charset="utf8")
        cursor = db.cursor()
               
        Sql_1 = "select * from table1"
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchall() #使用fetchall可以获取多个元素
        print(Result_1)
        print(type(Result_1))
       
        print("-" * 10)
       
        for Key_1 in Result_1: #自定义输出格式
                id = Key_1[0]
                name = Key_1[1]
                math = Key_1[2]
               
                address = Key_1[3]
                shijian = str(Key_1[4])

                print(f"id={id},姓名={name},数学成绩={math},地址={address},时间={shijian}")
                       
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:
C:\Users\jacky\Desktop>python xx.py
((1, '李大杰', Decimal('18.00'), 'guangzhou', datetime.datetime(2019, 9, 9, 7, 9, 18)), (2, '范小冰', Decimal('28.00'), 'foshan', datetime.datetime(2019, 10, 8, 5, 6, 8)), (3, 'zhuohua', Decimal('38.50'), 'zhuhai', datetime.datetime(2020, 1, 8, 18, 4, 7)))
<class 'tuple'>
----------
id=1,姓名=李大杰,数学成绩=18.00,地址=guangzhou,时间=2019-09-09 07:09:18
id=2,姓名=范小冰,数学成绩=28.00,地址=foshan,时间=2019-10-08 05:06:08
id=3,姓名=zhuohua,数学成绩=38.50,地址=zhuhai,时间=2020-01-08 18:04:07

C:\Users\jacky\Desktop>





######

例子八:
Win7客户端远程输出数据库中某个表里符合指定条件的记录的脚本:

#coding=utf-8
import pymysql

def query_data():
        db = pymysql.connect("192.168.168.130", "zhuohua", "1234", "zabbix",3306,charset="utf8")
        cursor = db.cursor()
               
        Key_1 = '2020-01-01' #日期范围
                       
        Sql_1 = f"select * from table1 where date(shijian) < '{Key_1}'" #根据字段shijian进行筛选;date()函数可以从具体时间中筛选出日期
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchall()
        print(Result_1)
        print(type(Result_1))
       
        print("-" * 10)
       
        for Key_1 in Result_1: #自定义输出格式
                id = Key_1[0]
                name = Key_1[1]
                math = Key_1[2]
               
                address = Key_1[3]
                shijian = str(Key_1[4])[0:10] #输出前面10个字符

                print(f"id={id},姓名={name},数学成绩={math},地址={address},时间={shijian}")
               
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:(假如找到匹配的记录时)
C:\Users\jacky\Desktop>python xx.py
((1, '李大杰', Decimal('18.00'), 'guangzhou', datetime.datetime(2019, 9, 9, 7, 9, 18)), (2, '范小冰', Decimal('28.00'), 'foshan', datetime.datetime(2019, 10, 8, 5, 6, 8)))
<class 'tuple'>
----------
id=1,姓名=李大杰,数学成绩=18.00,地址=guangzhou,时间=2019-09-09
id=2,姓名=范小冰,数学成绩=28.00,地址=foshan,时间=2019-10-08

C:\Users\jacky\Desktop>


脚本运行的结果:(假如没有找到匹配的记录时)
C:\Users\jacky\Desktop>python xx.py
()
<class 'tuple'>
----------


C:\Users\jacky\Desktop>





######

例子九:
Win7客户端远程输出数据库中某个表里符合指定条件的记录的脚本:

#coding=utf-8
import pymysql

def query_data():
        db = pymysql.connect("192.168.168.130", "zhuohua", "1234", "zabbix",3306,charset="utf8")
        cursor = db.cursor()
               
        Key_1 = 'Zhuohua' #关键字不区分英文字母大小写
        Key_2 = 1
       
        Sql_1 = f"select * from table1 where name='{Key_1}' or id={Key_2}"
        var_1 = cursor.execute(Sql_1) #给变量进行赋值时,已经执行了SQL语句;
       
        if var_1 != False:
               
                Result_1 = cursor.fetchall()
       
                for Key_1 in Result_1: #自定义输出格式
                        id = Key_1[0]
                        name = Key_1[1]
                        math = Key_1[2]
               
                        address = Key_1[3]
                        shijian = str(Key_1[4])[0:10] #输出前面10个字符

                        print(f"id={id},姓名={name},数学成绩={math},地址={address},时间={shijian}")
                       
                db.commit() #把执行任务提交到数据库
               
        else:
                print("没有找到匹配的记录。")
       
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:(假如找到匹配的记录时)
C:\Users\jacky\Desktop>python xx.py
id=1,姓名=李大杰,数学成绩=18.00,地址=guangzhou,时间=2019-09-09
id=3,姓名=zhuohua,数学成绩=38.50,地址=zhuhai,时间=2020-01-08

C:\Users\jacky\Desktop>


脚本运行的结果:(假如没有找到匹配的记录时)
C:\Users\jacky\Desktop>python xx.py
没有找到匹配的记录。

C:\Users\jacky\Desktop>





######

例子十:
Win7客户端远程保存(覆盖)数据库中某个表里符合指定条件的记录到文件的脚本:

#coding=utf-8
import pymysql

def query_data():
        db = pymysql.connect("192.168.168.130", "zhuohua", "1234", "zabbix",3306,charset="utf8")
        cursor = db.cursor()
               
        Key_1 = 18
        Key_2 = 'foshan'
       
        Sql_1 = f"select * from table1 where math = {Key_1} or address = '{Key_2}'"
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchall()
       
        for Key_1 in Result_1: #自定义输出格式
                id = Key_1[0]
                name = Key_1[1]
                math = Key_1[2]
               
                address = Key_1[3]
                shijian = str(Key_1[4])[0:10] #输出前面10个字符

                print(f"id={id},姓名={name},数学成绩={math},地址={address},时间={shijian}")
               
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:(文件1.txt不存在的话,会自动创建)
C:\Users\jacky\Desktop>python xx.py > 1.txt

C:\Users\jacky\Desktop>
C:\Users\jacky\Desktop>type 1.txt
id=1,姓名=李大杰,数学成绩=18.00,地址=guangzhou,时间=2019-09-09
id=2,姓名=范小冰,数学成绩=28.00,地址=foshan,时间=2019-10-08


C:\Users\jacky\Desktop>





######

例子十一:
Win7客户端远程保存(追加)数据库中某个表里符合指定条件的记录到文件的脚本:

#coding=utf-8
import pymysql

def query_data():
        db = pymysql.connect("192.168.168.130", "zhuohua", "1234", "zabbix",3306,charset="utf8")
        cursor = db.cursor()
                       
        Key_1 = '2020-01-08'
                       
        Sql_1 = f"select * from table1 where date(shijian) = '{Key_1}'"
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchall()
       
        for Key_1 in Result_1: #自定义输出格式
                id = Key_1[0]
                name = Key_1[1]
                math = Key_1[2]
               
                address = Key_1[3]
                shijian = str(Key_1[4])[0:10] #输出前面10个字符

                print(f"id={id},姓名={name},数学成绩={math},地址={address},时间={shijian}")
               
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:(文件1.txt不存在的话,会自动创建)
C:\Users\jacky\Desktop>python xx.py >> 1.txt

C:\Users\jacky\Desktop>
C:\Users\jacky\Desktop>type 1.txt
id=1,姓名=李大杰,数学成绩=18.00,地址=guangzhou,时间=2019-09-09
id=2,姓名=范小冰,数学成绩=28.00,地址=foshan,时间=2019-10-08
id=3,姓名=zhuohua,数学成绩=38.50,地址=zhuhai,时间=2020-01-08

C:\Users\jacky\Desktop>





############
############

Linux卸载第三方库(PyMySQL):
[root@centos6 ~]# pip3 uninstall pymysql -y
Uninstalling PyMySQL-0.10.1:
  Successfully uninstalled PyMySQL-0.10.1

[root@centos6 ~]#


Linux离线安装第三方库(PyMySQL):
[root@centos6 ~]# du -sh *.whl
48K     PyMySQL-0.10.1-py2.py3-none-any.whl
[root@centos6 ~]#

[root@centos6 ~]# pip3 install PyMySQL-0.10.1-py2.py3-none-any.whl
Processing ./PyMySQL-0.10.1-py2.py3-none-any.whl
Installing collected packages: PyMySQL
Successfully installed PyMySQL-0.10.1

[root@centos6 ~]#



############
############

Windows离线安装第三方库(PyMySQL):
C:\Users\jacky>cd desktop

C:\Users\jacky\Desktop>pip3 install PyMySQL-0.10.1-py2.py3-none-any.whl
Processing c:\users\jacky\desktop\pymysql-0.10.1-py2.py3-none-any.whl
Installing collected packages: PyMySQL
Successfully installed PyMySQL-0.10.1


C:\Users\jacky\Desktop>


Windows卸载第三方库(PyMySQL):
C:\Users\jacky\Desktop>pip3 uninstall pymysql -y
Uninstalling PyMySQL-0.10.1:
  Successfully uninstalled PyMySQL-0.10.1


C:\Users\jacky\Desktop>





相关文章:
MySQL的SQL语句
使用Navicat远程管理MySQL

Python3使用Socket发送信息
try语句
自定义函数
字符串的截取

Python3脚本管理Windows下的MySQL
Python3脚本管理Windows下的MariaDB
Python3脚本管理Oracle11gR2

Python3脚本管理MSSQL2014
CentOS8使用Python3脚本管理MySQL8.0

Zabbix调用Python3脚本监控Linux下的MySQL
Zabbix调用Python3脚本监控MySQL主从同步状态
Zabbix调用Python3脚本监控Linux下的MariaDB

CentOS8_LNMP_编译安装Zabbix5.0.12
Zabbix5.0.12_调用Python3脚本监控Linux下的MySQL

返回列表