返回列表 发帖

Python3脚本管理Windows下的MariaDB

笺注:这是在 Windows2008R2_UPUPW搭建WordPress+Discuz!7.2 的基础上进行的。


先切换到D:\UPUPW_AP5.6\MariaDB\bin,再登录MariaDB:
C:\Users\Administrator>d:

D:\>cd UPUPW_AP5.6\MariaDB\bin

D:\UPUPW_AP5.6\MariaDB\bin>mysql -u"root" -p"888"

图片1.png
2022-4-5 09:08



再授权数据库用户zhuohua@'%'(密码1234),可以从任意IP进行访问,对所有的库有完全控制的权限:
MariaDB [(none)]> grant all on *.* to zhuohua@'%' identified by '1234';
Query OK, 0 rows affected (0.00 sec)


MariaDB服务器要在防火墙打开TCP 3306 端口;


Windows、Linux系统安装第三方库(PyMySQL)可参考:Python3脚本管理Linux下的MySQL

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



######

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

#coding=utf-8
import pymysql

def db_connect():
       
        db = pymysql.connect("192.168.168.129", "zhuohua", "1234", "mysql",3306,charset="utf8") #连接数据库;库"mysql"是默认就存在的
       
        cursor = db.cursor()
       
        Sql_1 = "SELECT VERSION();" #查看MariaDB的版本信息
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchone() #使用fetchone只能获取一个元素

        print(Result_1)
        print(type(Result_1))
       
        print("-" * 10)
        print(Result_1[0]) #输出结果的第一项
        print(f"数据库连接成功,数据库的版本信息:{Result_1[0]}")
       
        db.commit() #把执行任务提交到数据库
        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
('10.1.8-MariaDB',)
<class 'tuple'>
----------
10.1.8-MariaDB
数据库连接成功,数据库的版本信息:10.1.8-MariaDB

C:\Users\jacky\Desktop>





######

例子二:
Win7客户端远程创建库的脚本:

#coding=utf-8
import pymysql

def create_database():
       
        db = pymysql.connect("192.168.168.129", "zhuohua", "1234", "mysql",3306,charset="utf8")
       
        cursor = db.cursor()
       
        Sql_1 = "create database data1;" #创建库data1
        cursor.execute(Sql_1)
       
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                create_database()
        except Exception as e:
                print(f"创建库data1失败,原因: {e}")
        else:
                print("创建库data1成功。")
               
if __name__ == "__main__":

        func_main()


脚本运行的结果:(假如库data1不存在时)
C:\Users\jacky\Desktop>python xx.py
创建库data1成功。

C:\Users\Administrator>


脚本运行的结果:(假如库data1存在时)
C:\Users\jacky\Desktop>python xx.py
创建库data1失败,原因: (1007, "Can't create database 'data1'; database exists")

C:\Users\jacky\Desktop>


在MariaDB服务器上查看库data1的字符集:
MariaDB [(none)]> show create database data1;
+----------+----------------------------------------------------------------+
| Database | Create Database                                                |
+----------+----------------------------------------------------------------+
| data1    | CREATE DATABASE `data1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [(none)]>

注释:此时数据库的默认字符集是 utf8_general_ci





######

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

#coding=utf-8

import pymysql

def create_table():
       
        db = pymysql.connect("192.168.168.129", "zhuohua", "1234", "data1",3306,charset="utf8")
        cursor = db.cursor()
       
        #创建表table1,字段id会自动增长;这是在库data1中创建表
        Sql_1 = """CREATE TABLE table1 (
        id int not null auto_increment,
        name varchar(20) NOT NULL,
        math decimal(50,2),
        date datetime,time datetime,
        primary key(id)
        )"""

        cursor.execute(Sql_1)

        db.commit() #把执行任务提交到数据库
        db.close()
       

def func_main():
        try:
                create_table()
        except Exception as e:
                print(f"创建表table1失败,原因: {e}")
        else:
                print("创建表table1成功。")
               
if __name__ == "__main__":

        func_main()


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

C:\Users\jacky\Desktop>


使用SQLyog查看表table1的表结构:
图片2.png
2022-4-5 09:12






######

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

#coding=utf-8
import pymysql

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

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

        Key_1 = 'zhuohua'
        Key_2 = 38.5
        Key_3 = tt_1
        Key_4 = tt_2
       
        Sql_3 = f"INSERT INTO table1(name,math,date,time) 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>


使用SQLyog查看表数据:(插入记录成功)
图片3.png
2022-4-5 09:13






######

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

#coding=utf-8
import pymysql

def query_data():
        db = pymysql.connect("192.168.168.129", "zhuohua", "1234", "data1",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]
               
                date = str(Key_1[3])
                time = str(Key_1[4])

                print(f"id={id},姓名={name},数学成绩={math},日期={date},时间={time}")
                       
        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'), datetime.datetime(2019, 9, 9, 0, 0), datetime.datetime(2019, 9, 9, 7, 9, 18)), (2, '范小冰', Decimal('28.00'), datetime.datetime(2019, 10, 8, 0, 0), datetime.datetime(2019, 10, 8, 5, 6, 8)), (3, 'zhuohua', Decimal('38.50'), datetime.datetime(2020, 7, 15, 0, 0), datetime.datetime(2020, 7, 15, 10, 43, 38)))
<class 'tuple'>
----------
id=1,姓名=李大杰,数学成绩=18.00,日期=2019-09-09 00:00:00,时间=2019-09-09 07:09:18
id=2,姓名=范小冰,数学成绩=28.00,日期=2019-10-08 00:00:00,时间=2019-10-08 05:06:08
id=3,姓名=zhuohua,数学成绩=38.50,日期=2020-07-15 00:00:00,时间=2020-07-15 10:43:38

C:\Users\jacky\Desktop>





######

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

#coding=utf-8
import pymysql

def query_data():
        db = pymysql.connect("192.168.168.129", "zhuohua", "1234", "data1",3306,charset="utf8")
        cursor = db.cursor()
               
        Key_1 = '2019-09-01' #日期范围
        Key_2 = '2019-10-08'
                       
        Sql_1 = f"select * from table1 where date between '{Key_1}' and '{Key_2}'" #根据字段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]
               
                date = str(Key_1[3])[0:10] #输出前面10个字符
                time = str(Key_1[4])[-8:] #输出最后8个字符

                print(f"id={id},姓名={name},数学成绩={math},日期={date},时间={time}")
                       
        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'), datetime.datetime(2019, 9, 9, 0, 0), datetime.datetime(2019, 9, 9, 7, 9, 18)), (2, '范小冰', Decimal('28.00'), datetime.datetime(2019, 10, 8, 0, 0), datetime.datetime(2019, 10, 8, 5, 6, 8)))
<class 'tuple'>
----------
id=1,姓名=李大杰,数学成绩=18.00,日期=2019-09-09,时间=07:09:18
id=2,姓名=范小冰,数学成绩=28.00,日期=2019-10-08,时间=05:06:08

C:\Users\jacky\Desktop>





######

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

#coding=utf-8
import pymysql

def query_data():
        db = pymysql.connect("192.168.168.129", "zhuohua", "1234", "data1",3306,charset="utf8")
        cursor = db.cursor()
               
        Key_1 = '2019-10-01' #日期范围
        Key_2 = '2021-01-01'
                       
        Sql_1 = f"select * from table1 where date(time) between '{Key_1}' and '{Key_2}'" #根据字段time进行筛选;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]
               
                date = str(Key_1[3])
                time = str(Key_1[4])

                print(f"id={id},姓名={name},数学成绩={math},日期={date},时间={time}")
                       
        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
((2, '范小冰', Decimal('28.00'), datetime.datetime(2019, 10, 8, 0, 0), datetime.datetime(2019, 10, 8, 5, 6, 8)), (3, 'zhuohua', Decimal('38.50'), datetime.datetime(2020, 7, 15, 0, 0), datetime.datetime(2020, 7, 15, 10, 43, 38)))
<class 'tuple'>
----------
id=2,姓名=范小冰,数学成绩=28.00,日期=2019-10-08 00:00:00,时间=2019-10-08 05:06:08
id=3,姓名=zhuohua,数学成绩=38.50,日期=2020-07-15 00:00:00,时间=2020-07-15 10:43:38

C:\Users\jacky\Desktop>





######

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

#coding=utf-8
import pymysql

def query_data():
        db = pymysql.connect("192.168.168.129", "zhuohua", "1234", "data1",3306,charset="utf8")
        cursor = db.cursor()
               
        Key_1 = 30
                       
        Sql_1 = f"select * from table1 where math > {Key_1}"
        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]
               
                date = str(Key_1[3])[0:10] #输出前面10个字符
                time = str(Key_1[4])[-8:] #输出最后8个字符

                print(f"id={id},姓名={name},数学成绩={math},日期={date},时间={time}")
                       
        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
((3, 'zhuohua', Decimal('38.50'), datetime.datetime(2020, 7, 15, 0, 0), datetime.datetime(2020, 7, 15, 10, 43, 38)),)
<class 'tuple'>
----------
id=3,姓名=zhuohua,数学成绩=38.50,日期=2020-07-15,时间=10:43:38

C:\Users\jacky\Desktop>





######

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

#coding=utf-8
import pymysql

def query_data():
        db = pymysql.connect("192.168.168.129", "zhuohua", "1234", "data1",3306,charset="utf8")
        cursor = db.cursor()
               
        Key_1 = 'Zhuohua' #关键字不区分英文字母大小写
        Sql_1 = f"select * from table1 where name='{Key_1}'"
        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]
               
                        date = str(Key_1[3])[0:10] #输出前面10个字符
                        time = str(Key_1[4])[-8:] #输出最后8个字符

                        print(f"id={id},姓名={name},数学成绩={math},\n日期={date},时间={time}")
                       
                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=3,姓名=zhuohua,数学成绩=38.50,
日期=2020-07-15,时间=10:43:38


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.129", "zhuohua", "1234", "data1",3306,charset="utf8")
        cursor = db.cursor()
               
        Sql_1 = "select avg(math) from table1" #求字段math的平均值
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchone()
        print(Result_1)
        print(type(Result_1))
       
        print("-" * 10)
       
        print(Result_1[0])
        print(type(Result_1[0]))
       
        Result_2 = "%.2f" % Result_1[0] #保留两位小数
        print(Result_2)
        print(type(Result_2))
       
        Result_3 = float(Result_2)
        print(Result_3)
        print(type(Result_3))
                       
        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
(Decimal('28.166667'),)
<class 'tuple'>

----------
28.166667
<class 'decimal.Decimal'>

28.17
<class 'str'>
28.17
<class 'float'>

C:\Users\jacky\Desktop>





######

例子十一:
Win7客户端远程更改记录的脚本:

#coding=utf-8
import pymysql

def update_record():

        global db
        db = pymysql.connect("192.168.168.129", "zhuohua", "1234", "data1",3306,charset="utf8")
        cursor = db.cursor()
       
        Key_1 = 38.5
        Key_2 = 66.5
        Sql_1 = f"UPDATE table1 SET math={Key_2} where math={Key_1}"
        cursor.execute(Sql_1)

        db.commit() #把执行任务提交到数据库
        db.close()
       
def func_main():
        try:
                update_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>


使用SQLyog查看表数据:(更改记录成功)
图片4.png
2022-4-5 09:23


备注:假如没有找到匹配的记录进行更改,会直接跳过,不会报错的。





######

例子十二:
Win7客户端远程删除记录的脚本:

#coding=utf-8
import pymysql

def delete_record():

        global db
        db = pymysql.connect("192.168.168.129", "zhuohua", "1234", "data1",3306,charset="utf8")
        cursor = db.cursor()
       
        Key_1 = 66.5
        Sql_1 = f"DELETE FROM table1 where math != {Key_1}"
        cursor.execute(Sql_1)

        db.commit() #把执行任务提交到数据库
        db.close()
       
def func_main():
        try:
                delete_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>


使用SQLyog查看表数据:(删除记录成功)
图片5.png
2022-4-5 09:24


备注:假如没有找到匹配的记录进行删除,会直接跳过,不会报错的。













######

例子十三:
MariaDB服务器本地测试与数据库的连接的脚本:(D:\yy.py)

#coding=utf-8
import pymysql

def db_connect():

        #连接数据库;使用数据库用户root@localhost,即在服务器本地进行管理;库"mysql"是默认就存在的
        db = pymysql.connect("localhost", "root", "888", "mysql",3306,charset="utf8")
       
        cursor = db.cursor()
       
        Sql_1 = "SELECT VERSION()" #查看MariaDB的版本信息
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchone()

        print(Result_1[0]) #输出结果的第一项
        print(f"数据库连接成功,数据库的版本信息:{Result_1[0]}")
       
        db.commit() #把执行任务提交到数据库
        db.close()

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

if __name__ == "__main__":

        func_main()

脚本运行的结果:
C:\Users\Administrator>python d:/yy.py
10.1.8-MariaDB
数据库连接成功,数据库的版本信息:10.1.8-MariaDB

C:\Users\Administrator>





######

例子十四:
MariaDB服务器本地清空某个库中的某个表的脚本:

#coding=utf-8
import pymysql

def truncate_table():

        db = pymysql.connect("localhost", "root", "888", "data1",3306,charset="utf8")
        cursor = db.cursor()
       
        Sql_1 = "truncate table table1" #清空库data1中的表table1
        cursor.execute(Sql_1)
       
        db.commit() #把执行任务提交到数据库
        db.close()
       
        print ("清空表table1成功。")

def func_main():
        try:
                truncate_table()
        except Exception as e:
                print(f"清空表失败,原因: {e}")

if __name__ == "__main__":
        func_main()


脚本运行的结果:
C:\Users\Administrator>python d:/yy.py
清空表table1成功。

C:\Users\Administrator>


使用SQLyog查看表数据:(清空表成功)
图片6.png
2022-4-5 09:26






######

例子十五:
MariaDB服务器本地删除某个库中的某个表的脚本:

#coding=utf-8
import pymysql

def drop_table():

        db = pymysql.connect("localhost", "root", "888", "data1",3306,charset="utf8")
        cursor = db.cursor()
       
        Sql_1 = "show tables like 'table1';"  #检查库data1中的表table1是否存在;
        var_1 = cursor.execute(Sql_1)
       
        if var_1 != False:
       
                Sql_2 = "DROP TABLE table1;"  #如果表table1存在就删除
               
                cursor.execute(Sql_2)
                db.commit() #把执行任务提交到数据库
               
                print ("删除表table1。")
       
        else:

                print("表table1不存在,不会进行删除。")
               
        db.close()
                       
if __name__ == "__main__":

        drop_table()


脚本运行的结果:(假如表存在时)
C:\Users\Administrator>python d:/yy.py
删除表table1。

C:\Users\Administrator>


脚本运行的结果:(假如表不存在时)
C:\Users\Administrator>python d:/yy.py
表table1不存在,不会进行删除。

C:\Users\Administrator>





######

例子十六:
MariaDB服务器本地删除某个库脚本:

#coding=utf-8
import pymysql

def drop_database():

        db = pymysql.connect("localhost", "root", "888", "mysql",3306,charset="utf8")
        cursor = db.cursor()
       
        Sql_1 = "show databases like 'data1';"  #检查库data1是否存在;
        var_1 = cursor.execute(Sql_1)
       
        if var_1 != False:
       
                Sql_2 = "drop database data1;"  #如果库data1存在就删除
               
                cursor.execute(Sql_2)
                db.commit() #把执行任务提交到数据库
               
                print ("删除库data1。")
       
        else:
                print("库data1不存在,不会进行删除。")

               
        db.close()
                       
if __name__ == "__main__":

        drop_database()


脚本运行的结果:(假如库data1存在时)
C:\Users\Administrator>python d:/yy.py
删除库data1。


脚本运行的结果:(假如库data1不存在时)
C:\Users\Administrator>python d:/yy.py
库data1不存在,不会进行删除。

C:\Users\Administrator>





相关文章:
Zabbix创建模板监控Windows下的MariaDB
Zabbix调用Python3脚本监控Linux下的MariaDB

Python3脚本管理Linux下的MySQL

返回列表