pymysql
除了使用图形化工具以外,我们也可以使用编程语言来执行SQL从而操作数据库。
在Python中,使用第三方库:pymysql 来完成对MySQL数据库的操作。
安装: pip install pymysql
或在pycharm中搜索pymysql插件安装
创建到MySQL的数据库链接
from pymysql import Connection
# 构建到MySQL数据库的链接
conn = Connection(host="localhost", # 主机名IPport=3306, # 端口user="root", # 账户password="123123" # 账号密码)# 打印MySQL数据库软件信息
print(conn.get_server_info())# 关闭到数据库的链接
conn.close()
执行SQL语句
from pymysql import Connection
# 构建到MySQL数据库的链接
conn = Connection(host="localhost", # 主机名IPport=3306, # 端口user="root", # 账户password="123123" # 账号密码)
# 打印MySQL数据库软件信息
# print(conn.get_server_info())
# 执行非查询性质SQL
cursor = conn.cursor() # 获取到游标对象
# 选择数据库
conn.select_db("test")
# 执行SQL
cursor.execute("insert into student values( id,'周杰伦', 31) ") # 执行添加数据的方法
# 通过commit 确认
# conn.commit() # 提交# result = cursor.fetchall() # 获取表中的数据
# print(result)
# for a in result:
# print(a)# 关闭链接
conn.close()
commit提交
经过执行是无法将数据插入到数据表student中的。
这是为什么呢?
pymysql在执行数据插入或其它产生数据更改的SQL语句时,默认是需要提交更改的,即,需要通过代码“确认”这种更改行为。
通过链接对象.commit() 即可确认此行为。
自动commit
如果不想手动commit确认,可以在构建链接对象的时候,设置自动commit的属性。
from pymysql import Connection
# 构建到MySQL数据库的链接
conn = Connection(host="localhost", # 主机名IPport=3306, # 端口user="root", # 账户password="123123", # 账号密码autocommit=True # 设置自动提交
)
案例:
要求:
我们使用《面向对象》章节案例中的数据集,完成使用Python语言,读取数据,并将数据写入MySQL的功能
文件读取及数据处理
file_define.py
"""
和文件相关的类定义
"""
import jsonfrom data_define import Record# 先定义一个抽象类用来做顶层设计,确定有哪些功能要实现
class FileReader:def read_data(self) -> list[Record]:"""读取文件的数据,读到的每一条数据都转为Record对象,将它们都封装到list内返回即可:return:"""passclass TextFileReader(FileReader):def __init__(self, path):self.path = path # 定义成员变量记录文件的路径# 复写(实现抽象方法)父类的方法def read_data(self) -> list[Record]:f = open(self.path, "r", encoding="UTF-8")read_list: list[Record] = []for line in f.readlines():line = line.strip() # 消除读取到的每一行数据中的\ndata_list = line.split(",")record = Record(data_list[0], data_list[1], int(data_list[2]), data_list[3])read_list.append(record)f.close()return read_listclass JsonFileReader(FileReader):def __init__(self, path):self.path = path # 定义成员变量记录文件的路径# 复写(实现抽象方法)父类的方法def read_data(self) -> list[Record]:f = open(self.path, "r", encoding="UTF-8")read_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"])read_list.append(record)f.close()return read_listif __name__ == '__main__':text_file_reader = TextFileReader("D:/2011年1月销售数据.txt")json_file_reader = JsonFileReader("D:/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)
数据定义
data_define.py
"""
数据定义的类
"""class Record:def __init__(self, date, order, money, province):self.date = date # 订单日期self.order = order # 订单IDself.money = money # 订单金额self.province = province # 订单省份def __str__(self): # 将地址数据转换为字符串return f"{self.date}, {self.order}, {self.money}, {self.province}"
将数据存入数据库
main.py
from file_define import FileReader, JsonFileReader, TextFileReader
from data_define import Record
from pymysql import Connection
import json
text_file_reader = TextFileReader("D:/2011年1月销售数据.txt")
json_file_reader = JsonFileReader("d:/2011年2月销售数据JSON.txt")jan_data: list[Record] = text_file_reader.read_data()
feb_data: list[Record] = json_file_reader.read_data()# 将俩个月份的数据合并为一个list来存储
all_data: list[Record] = jan_data + feb_data# 构建MySQL链接对象
conn = Connection(host="localhost", # 主机名IPport=3306, # 端口user="root", # 账户password="123123", # 账号密码autocommit=True # 提交事务(自动提交)
)
# 执行非查询性质SQL
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.date}', '{record.order}', '{record.money}', '{record.province}')"# 执行SQL语句cursor.execute(sql)# 关闭MySQL链接对象
conn.close()
从数据库读取数据并转为json格式
main.py
from file_define import FileReader, JsonFileReader, TextFileReader
from data_define import Record
from pymysql import Connection
import json
text_file_reader = TextFileReader("D:/2011年1月销售数据.txt")
json_file_reader = JsonFileReader("d:/2011年2月销售数据JSON.txt")jan_data: list[Record] = text_file_reader.read_data()
feb_data: list[Record] = json_file_reader.read_data()# 将俩个月份的数据合并为一个list来存储
all_data: list[Record] = jan_data + feb_data# 构建MySQL链接对象
conn = Connection(host="localhost", # 主机名IPport=3306, # 端口user="root", # 账户password="123123", # 账号密码autocommit=True # 提交事务(自动提交)
)
# 执行非查询性质SQL
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.date}', '{record.order}', '{record.money}', '{record.province}')"
# # 执行SQL语句
# cursor.execute(sql)# 查询数据
# 组织SQL语句
cursor.execute("select * from orders") # 执行查询方法
result = cursor.fetchall() # 获取表中的数据
my_list = []
my_dict = {}
for a in result:time_faml = a[0].strftime("%Y-%m-%d")my_dict = {"order_date": time_faml, "order_id": a[1], "money": a[2], "province": a[3]}my_list.append(my_dict)json_str = json.dumps(my_list, ensure_ascii=False)
print(json_str)
# 关闭MySQL链接对象
conn.close()