少年有梦,不应至于心动,更要付诸行动
—— 24.4.12
pymysql
除了使用图形化工具以外,我们也可以使用编程语言来执行SQL从而操作数据库
在Python中,使用第三方库:pymysql来完成对MySQl数据库的操作
安装
pip install pymysql
创建到MySQL的数据库链接
from pymysql import Connection # 获取到MySQL数据库的链接对象 conn = Connection( host = 'localhost', # 主机名(IP地址) port = 3306, # 端口,默认3306 user = 'root', # 账户名 password = 'xxxxxxx' # 密码 ) # 打印MySQL数据库软件信息 print(conn.get_server_info()) # 关闭到数据库的链接 conn.close()
pymysql库的基本操作
非查询性质SQL
''' 演示Python pymysql库的基本操作 ''' from pymysql import Connection # 获取到MySQL数据库的链接对象 conn = Connection( host = 'localhost', # 主机名(IP地址) port = 3306, # 端口,默认3306 user = 'root', # 账户名 password = '954926928lcl' # 密码 ) # 执行非查询性质SQL # 获取游标对象 cursor = conn.cursor() # 选择数据库 conn.select_db("test") # 使用游标对象,执行sql语句 cursor.execute("create table pythonTest(id int);") # 分号可省略
查询性质SQL
''' 演示Python pymysql库的基本操作 ''' from pymysql import Connection # 获取到MySQL数据库的链接对象 conn = Connection( host = 'localhost', # 主机名(IP地址) port = 3306, # 端口,默认3306 user = 'root', # 账户名 password = '954926928lcl' # 密码 ) # 执行非查询性质SQL # 获取游标对象 cursor = conn.cursor() # 选择数据库 conn.select_db("twe_8") # 使用游标对象,执行sql语句 # 执行查询性质SQl # 获取查询结果 cursor.execute("select * from dept") # 拿到查询结果 results = cursor.fetchall() # 打印出查询结果 for r in results: print(r) # 打印MySQL数据库软件信息 # print(conn.get_server_info()) # 关闭到数据库的链接 conn.close()
如何获取链接对象
①from pymysql import Connection 导包
②Connection(主机,端口,账户,密码)即可得到链接对象
③链接对象.close() 关闭和MySQL数据库的链接
如何执行SQL查询
通过链接对象调用cursor()方法,得到游标对象
游标对象.execute()执行SQL语句
游标对象.fetchall()得到全部的查询结果封装入元组内
数据插入
commit提交
经过python执行的数据插入操作是无法将数据插入到数据表中
***因为pymysql是在执行数据插入或其他产生数据更改的SQL语句时,默认需要提交更改的,即:需要通过代码”确认“这种更改行为
通过 链接对象.commit() 即可确认此行为,只有确认的修改,才能生效
''' 演示使用pymysql库进行数据插入的操作 ''' # 导包 from pymysql import Connection # 构建MySQL数据库的链接 conn = Connection( host = 'localhost', # 主机名(IP地址) port = 3306, # 端口,默认3306 user = 'root', # 账户名 password = 'xxxxx' # 密码 ) # 执行非查询性质SQL cursor = conn.cursor() # 获取到游标对象 # 选择数据库 conn.select_db("ele_29") # 执行sql cursor.execute("insert into dept values(45,'小明')") # 通过commit确认 conn.commit() # 关闭链接 conn.close()
自动commit
如果不想手动commit确认,可以在构建链接对象的时候,设置自动commit的属性
autocommit = True
# 构建到MySQL数据库的链接 conn = Connection( host = "localhost", # 主机名(IP) port = 3306, # 端口 user = "root", # 账户 password = "xxxxxx", # 密码 autocommit = True # 设置自动提交 )
如上代码进行设置,即可自动提交无需手动commit了
示例:
''' 演示使用pymysql库进行 数据插入 的操作 ''' # 导包 from pymysql import Connection # 构建MySQL数据库的链接 conn = Connection( host = 'localhost', # 主机名(IP地址) port = 3306, # 端口,默认3306 user = 'root', # 账户名 password = '954926928lcl', # 密码 autocommit = True # 设置自动提交(确认) ) # 执行非查询性质SQL cursor = conn.cursor() # 获取到游标对象 # 选择数据库 conn.select_db("ele_29") # 执行sql cursor.execute("insert into dept values(1001,'林俊接')") # # 通过commit确认 # conn.commit() # 关闭链接 conn.close()
运行结果
综合案例
使用SQL语句和pymysql库完成综合案例的开发
我们使用前文中的销售数据集,完成使用Python语言,读取数据,并将数据写入MySQL的功能
1.DDL定义
本次需求开发我们需要新建一个数据库来使用,数据库名称:py_sql
基于数据结构,我们可以得到建表语句
create table orders( order_date DATE, order_in varchar(255) money int, province varchar(10) )
① 创建数据库
② 使用py_sql数据库
use py_sql;
③ 建表语句
create table orders( order_date date, order_id varchar(255), money int, province varchar(10) );
④ 数据定义的类
''' 数据定义的类 1. 设计一个类,可以完成数据的封装 ''' class Record: # 使用构造方法定义成员变量 方便在构造类对象的时候直接赋值 def __init__(self,data,order_id,money,province): self.data = data # 订单日期 self.order_id = order_id # 订单ID self.money = money # 订单金额 self.province = province # 销售省份 # 定义一个魔术方法 # 定义一个成员方法,不然直接返回会返回一个内存地址 def __str__(self): return f"{self.data},{self.order_id},{self.money},{self.province}"
⑤ 文件相关的类
''' 和文件相关的类定义在这里 2. 设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能 ''' import json # 导包 from data_define import Record # 定义一个抽象类用来做顶层设计,确定类中有哪些功能需要实现 class FileReader: # 顶层设计 pass变为抽象方法 def read_data(self) -> list[Record]: # 返回值是一个Record类的列表List # 读取文件的数据,将读到的每一条数据都转换为我们定义的Record类对象,使用list将record对象封装起来返回即可 pass # 文本数据的文件读取器,继承抽象类 class TextFileReader(FileReader): # 定义一个构造方法 def __init__(self, path): self.path = path # 定义成员变量记录文件的路径 # 复写(实现抽象方法)父类的方法 def read_data(self) -> list[Record]: # 方法内部使用成员变量用self f = open(self.path, "r", encoding="UTF-8") # 类型注解 record_list: list[Record] = [] for line in f.readlines(): # 消除读取到的每一行数据中的\n line = line.strip() # 以逗号用split方法进行切割 data_list = line.split(",") # 金钱数字进行转换int() record = Record(data_list[0], data_list[1], int(data_list[2]), data_list[3]) record_list.append(record) # 关闭文件对象 f.close() # 返回record对象列表 return record_list # JSON文件读取器2 # 同样继承于FileReader class JsonFileReader(FileReader): def __init__(self, path): # 定义成员变量记录文件的路径 self.path = path def read_data(self) -> list[Record]: f = open(self.path, "r", encoding="UTF-8") record_list: list[Record] = [] for line in f.readlines(): data_dict = json.loads(line) record = Record(data_dict["date"], data_dict["order_id"], int(data_dict["money"]), data_dict["province"]) # 将record对象放入record_list中,并返回 record_list.append(record) # 关闭文件对象 f.close() return record_list if __name__ == '__main__': text_file_reader = TextFileReader("E:\python.learning\第13章资料/2011年1月销售数据.txt") json_file_reader = JsonFileReader("E:\python.learning\第13章资料/2011年2月销售数据JSON.txt") list1 = text_file_reader.read_data() list2 = json_file_reader.read_data() for l in list1: # 魔术方法 print(l) for l in list2: print(l)
⑥ 综合案例main代码
# 导包 from file_define import FileReader, TextFileReader, JsonFileReader from data_define import Record from pymysql import Connection # 读取数据,将读取到的数据保存在变量中 text_file_reader = TextFileReader("E:\python.learning\第13章资料/2011年1月销售数据.txt") json_file_reader = JsonFileReader("E:\python.learning\第13章资料/2011年2月销售数据JSON.txt") # 一月份数据 jan_data: list[Record] = text_file_reader.read_data() # 类型注解 # 二月份数据 feb_data: list[Record] = json_file_reader.read_data() # 类型注解 # 将两个月份的数据合并为1个list来存储,通过加法存储 all_data: list[Record] = jan_data + feb_data # 类型注解 # 构建MySQL链接对象 conn = Connection( host = "localhost", port = 3306, user = "root", password ="954926928lcl", autocommit = True ) # 获得游标对象 cursor = conn.cursor() # 选择数据库 conn.select_db("py_sql") # 组织SQL语句 for record in all_data: sql = f"insert into orders(order_date,order_id,money,province)" \ f"values('{record.data}', '{record.order_id}', '{record.money}', '{record.province}')" # 通过游标对象传递SQL语句传给游标对象 执行SQL语句 cursor.execute(sql) # 关闭MySQL链接对象 conn.close()
结果
⑦ 课后作业
将我们写入到MySQL的数据,通过Python代码读取出来,再反向写出如图的文件
代码
# 导包 import json from pymysql import Connection f = open("D:PythonSqlExa.txt", "w", encoding="UTF-8") # 构建MySQL链接对象 conn = Connection( host="localhost", port=3306, user="root", password="954926928lcl", autocommit=True ) # 获得游标对象 cursor = conn.cursor() # 选择数据库 conn.select_db("py_sql") # 选择表 cursor.execute("select * from orders") # 存储数据 data_tuple = cursor.fetchall() f = open("E:\python.learning\pythonSql.txt", "w", encoding="UTF-8") data_dict = {} for record in data_tuple: data_dict["data"] = str(record[0]) data_dict["order_id"] = record[1] data_dict["money"] = int(record[2]) data_dict["province"] = record[3] f.write(json.dumps(data_dict, ensure_ascii=False)) f.write("\n") f.close() conn.close()
运行结果