Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库

2024-04-14 1635阅读

少年有梦,不应至于心动,更要付诸行动

                                                     —— 24.4.12

pymysql

除了使用图形化工具以外,我们也可以使用编程语言来执行SQL从而操作数据库

在Python中,使用第三方库:pymysql来完成对MySQl数据库的操作

安装

pip install pymysql

Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库

创建到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()

Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库

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);")    # 分号可省略

Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库

查询性质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()

Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库

如何获取链接对象

        ①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()

Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库自动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()

运行结果

Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库

综合案例

使用SQL语句和pymysql库完成综合案例的开发

        我们使用前文中的销售数据集,完成使用Python语言,读取数据,并将数据写入MySQL的功能

1.DDL定义

本次需求开发我们需要新建一个数据库来使用,数据库名称:py_sql

基于数据结构,我们可以得到建表语句

create table orders(
    order_date DATE,
    order_in varchar(255)
    money int,
    province varchar(10)
)

① 创建数据库

Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库

② 使用py_sql数据库

use py_sql;

Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库

③ 建表语句

create table orders(
	order_date date,	
	order_id varchar(255),
	money int,
	province varchar(10)
);

Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库

④ 数据定义的类

'''
数据定义的类
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()

 结果

Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库

⑦ 课后作业

     将我们写入到MySQL的数据,通过Python代码读取出来,再反向写出如图的文件

Python学习从0到1 day25 第二阶段 SQL ② 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()

运行结果

Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]