第一阶段入门:Python入门(1)——第一阶段_python最新的解释器-CSDN博客
—— 第二阶段 ——
目录
一、面向对象
1.类的成员方法
类中定义的属性(变量),我们称之为:成员变量
类中定义的行为(函数),我们称之为:成员方法
* 函数是写在类外的,定义在类内部的称为方法
#类和成员方法的定义语法
#创建类
class 类名称:
成员变量
def 成员方法名(self,参数列表):
成员方法体
#创建对象
对象 = 类名称()
self的作用:
- self表示类对象本身的意思。
- 只有通过self,成员方法才能访问类的成员变量。
- self出现在形参列表中,但是不占用参数位置,无需理会。
#示例
#定义类
class Student:
#成员变量
name = None
#成员方法
def say_hi(self):
print(f"大家好,我是{self.name}。")
def say_hi2(self,msg):
print(f"大家好,我是{self.name},{msg}")
#创建对象
stu_1 = Student()
#对象属性进行赋值
stu_1.name = "小明"
#调用成员方法
stu_1.say_hi()
stu_1.say_hi2("请多多关照")
#输出结果:
大家好,我是小明。
大家好,我是小明,请多多关照
2.类和对象
面向对象编程:使用对象进行编程。
即,设计类,基于类创建对象,并使用对象来完成具体的工作。
#设计一个闹钟类
class Clock:
id = None
price = None
def ring(self):
import winsound
winsound.Beep(2000,3000)
#构建2个闹钟对象并让其工作
clock1 = Clock()
clock1.id = "00001"
clock1.price = 19.99
print(f"闹钟ID:{clock1.id},价格:{clock1.price}")
clock1.ring()
clock2 = Clock()
clock2.id = "00002"
clock2.price = 29.99
print(f"闹钟ID:{clock2.id},价格:{clock2.price}")
clock2.ring()
#输出结果:
闹钟ID:00001,价格:19.99
闹钟ID:00002,价格:29.99
3.构造方法
构造方法:__init__()方法 (前后各有两个下划线)
可以实现:
- 在创建类对象(构造类)的时候,会自动执行。
- 在创建类对象(构造类)的时候,将传入参数自动传递给 init 方法使用。
* 构造方法不要忘记self关键字
* 在方法内使用成员变量需要使用self
class Student:
name =None
age = None #成员变量这里可以不写,成员变量会在构造方法进行赋值的时候存在
tel =None
def __init__(self,name,age,tel):
self.name = name
self.age = age
self.tel = tel
print("Student类创建了一个类对象")
stu = Student("小明",22,12345678910)
print(stu.name)
print(stu.age)
print(stu.tel)
#输出结果:
Student类创建了一个类对象
小明
22
12345678910
练习:
开学了有一批学生信息需要录入系统,请设计一个类,记录学生的:姓名、年龄、地址,这3类信息
请实现:
- 通过for循环,配合input输入语句,并使用构造方法,完成学生信息的键盘录入
- 输入完成后,使用print语句,完成信息的输出
class Student:
name = None
age = None
address = None
def __init__(self,name,age,address):
self.name = name
self.age = age
self.address = address
for index in range(1,11):
print(f"当前录入第{index}位学生信息,总共需录入10位学生信息")
name = input("请输入学生姓名:")
age =input ("请输入学生年龄:")
address = input("请输入学生地址:")
stu = Student(name,age,address)
print(f"学生{index}信息录入完成,信息为:【学生姓名:{stu.name},年龄:{stu.age},地址:{stu.address}】")
#输出示例:
当前录入第1位学生信息,总共需录入10位学生信息
请输入学生姓名:1
请输入学生年龄:1
请输入学生地址:1
学生1信息录入完成,信息为:【学生姓名:1,年龄:1,地址:1】
当前录入第2位学生信息,总共需录入10位学生信息
请输入学生姓名:2
请输入学生年龄:2
请输入学生地址:2
学生2信息录入完成,信息为:【学生姓名:2,年龄:2,地址:2】
......
4.其他内置方法
内置的类方法,各有各自特殊的功能,这些内置方法我们称之为:魔术方法
- __init__:构造方法
- __str__:字符串方法
- __lt__:小于、大于符号比较
- __le__:小于等于、大于等于符号比较
- __eq__:==符号比较
class Student:
#构造方法
def __init__(self,name,age):
self.name = name
self.age = age
#__str__魔术方法
def __str__(self):
return f"Student类对象:name:{self.name},age:{self.age}"
#__lt__魔术方法
def __lt__(self, other):
return self.age < other.age
#__le__魔术方法
def __le__(self,other):
return self.age <= other.age
#__le__魔术方法
def __eq__(self, other):
return self.age == other.age
stu1 = Student("小明",11)
stu2 = Student("小李",17)
print(stu1 > stu2)
print(stu1 <= stu2)
print(stu1 == stu2)
#输出结果:
False
True
False
5.封装
1.封装:将现实世界中的事物在类中描述为属性和方法。
2.私有成员
现实事物有部分属性和行为是不公开对使用者开放的,需要定义私有成员。
私有成员的成员变量和成员方法命名均以__作为开头。(两个下划线)
私有成员无法被类对象使用,但是可以被类中其他的成员使用。
私有成员的意义:在类中提供仅供内部使用的属性和方法,而不对外开放(类对象无法使用)
class Phone:
#私有成员变量
__current_voltage = 0 #当前手机运行电压
#私有成员方法
def __keep_single_core(self):
print("让CPU以单核模式运行")
def call_by_5g(self):
if self.__current_voltage >= 1:
print("5g通话开启")
else:
self.__keep_single_core()
print("电量不足,无法使用5g通话,并已设置为单核运行进行省电。")
phone =Phone()
phone.call_by_5g()
#输出结果:
让CPU以单核模式运行
电量不足,无法使用5g通话,并已设置为单核运行进行省电。
#注意:
phone.__keep_single_core()是错误的!类对象不能引用私有成员方法。
但是phone.call_by_5g()可以,call_by_5g()是类中的成员方法,可以使用类内的私有成员方法。
练习:设计带有私有成员的手机
设计一个手机类,内部包含:
- 私有成员变量:__is_5g_enable,类型bool,True表示开启5g,False表示关闭5g
- 私有成员方法:__check_5g(),会判断私有成员__is_5g_enable的值
- 若为True,打印输出:5g开启
- 若为False,打印输出:5g关闭,使用4g网络
- 公开成员方法:call_by_5g(),调用它会执行
- 调用私有成员方法:__check_5g(),判断5g网络状态
- 打印输出:正在通话中
class Phone:
#私有成员变量
__is_5g_enable = False #5g状态
#私有成员方法
def __check_5g(self):
if self.__is_5g_enable: #别忘了写self
print("5g开启")
else:
print("5g关闭,使用4g网络")
#公开成员方法
def call_by_5g(self):
self.__check_5g()
print("正在通话中")
phone =Phone()
phone.call_by_5g()
#输出示例
__is_5g_enable = False时
输出结果:
5g关闭,使用4g网络
正在通话中
__is_5g_enable = True时
输出结果:
5g开启
正在通话中
6.继承
6.1 继承的基础语法
#格式
class 子类名(父类名):
类内容体
#单继承示例
class Phone:
IMEI = None
producer = "HM"
def call_by_4g(self):
print("4g通话")
class Phone2022(Phone):
face_id = "1002024"
def call_by_5g(self):
print("新功能:5g通话")
phone = Phone2022()
print(phone.producer)
phone.call_by_4g()
phone.call_by_5g()
#输出结果:
HM
4g通话
新功能:5g通话
多继承中,如果父类有同名方法或属性,先继承的优先级高于后继承 。
pass的作用:占位语句,补全语法,无意义。
#多继承示例
class Phone:
IMEI = None
producer = "HM"
def call_by_4g(self):
print("4g通话")
class NFCReader:
nfc_type = "第5代"
producer = "HM"
def read_card(self):
print("NFC读卡")
def write_card(self):
print("NFC写卡")
class RemoteControl:
rc_type = "红外遥控"
def control(self):
print("红外遥控器开启了")
class MyPhone(Phone,NFCReader,RemoteControl):
pass #补全语法
phone = MyPhone()
phone.call_by_4g()
phone.read_card()
phone.control()
#输出结果:
4g通话
NFC读卡
红外遥控器开启了
6.2 复写和使用父类成员
复写:对于继承的成员属性和成员方法不满意,可以复写,即在子类中重新定义同名的属性或方法。
#父类
class Phone:
IMEI = None
producer = "ITCAST"
def call_by_5g(self):
print("使用5g网络进行通话")
#子类
class MyPhone(Phone):
producer = "HM"
def call_by_5g(self):
print("开启CPU单核模式,确保通话的时候省电")
print("使用5g网络进行通话")
print("关闭CPU单核模式,确保性能")
phone = MyPhone()
phone.call_by_5g()
print(phone.producer)
#输出结果:
开启CPU单核模式,确保通话的时候省电
使用5g网络进行通话
关闭CPU单核模式,确保性能
HM
在子类中,如何调用父类成员:
方法1:
- 调用父类成员
- 父类名.成员变量
- 父类名。成员方法(self)
方法2:
- 使用super()调用父类成员
- super().成员变量
- super().成员方法()
注意:只可以在子类内部调用父类的同名成员,子类的实体类对象调用默认是调用子类复写的。
#父类
class Phone:
IMEI = None
producer = "ITCAST"
def call_by_5g(self):
print("使用5g网络进行通话")
#子类
class MyPhone(Phone):
producer = "HM"
def call_by_5g(self):
print("开启CPU单核模式,确保通话的时候省电")
#方式1
print(f"方法1父类的厂商是:{Phone.producer}")
Phone.call_by_5g(self)
#方法2
print(f"方法2父类的厂商是:{super().producer}")
super().call_by_5g()
print("关闭CPU单核模式,确保性能")
phone = MyPhone()
phone.call_by_5g()
print(phone.producer)
#输出结果:
开启CPU单核模式,确保通话的时候省电
方法1父类的厂商是:ITCAST
使用5g网络进行通话
方法2父类的厂商是:ITCAST
使用5g网络进行通话
关闭CPU单核模式,确保性能
HM
7.类型注解
7.1 变量的类型注解
基础语法:变量:类型
import random,json
#基础数据类型注解
ver_1: int = 10
ver_2: str = "hello"
ver_3: bool = True
#类对象类型注解
class Student:
pass
stu: Student = Student()
#基础容器类型注解
my_list: list = [1,2,3]
my_tuple: tuple = (1,2,3)
my_dict: dict = {"hello":666}
#容器类型详细注解
mylist: list[int] = [1,2,3]
mytuple: tuple[int,str,bool] = (1,"hello",True)
mydict: dict[str,int] = {"hello":666}
#在注释中进行类型注解
ver_4 = random.randint(1,10) #type: int
ver_5 = json.loads('{"name":"zhangsan"}') #type: dict[str,str]
def func():
return 10
var_6 = func() #type: int
7.2 函数(方法)的类型注解
#对形参进行类型注解
def add(x:int,y:int):
return x+y
#对返回值进行类型注解
def func(data:list)->list: #"data:list"是对形参进行类型注解
return data #"->list"是对返回值进行类型注解
print(func([1,2]))
7.3 Union类型
Union的定义:Union[类型,......,类型],可以定义联合类型注解
from typing import Union
#变量的类型注解
my_list: list [Union[int,str]] = [1,2,"hello","world"]
#方法的类型注解
def func(data: Union[int,str]) -> Union[int,str]:
pass
func(1)
8.多态
多态:指多种状态,即完成某个行为时,使用不同的对象会得到不同的状态
#演示多态
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
print("汪汪汪")
class Cat(Animal):
def speak(self):
print("喵喵喵")
def make_noise(animal:Animal): #make_noise,需要传入Animal对象
animal.speak()
#演示多态,使用2个子类对象来调用函数
dog = Dog()
cat = Cat()
make_noise(dog)
make_noise(cat)
#输出结果:
汪汪汪
喵喵喵
抽象类:含有抽象方法的类称之为抽象类
抽象方法:方法体是空实现的(pass)称之为抽象方法
抽象类的作用:
- 多用于顶层设计(设计标准),以便子类做具体实现。
- 也是对子类的一种软性约束,要求子类必须复写(实现)父类的一些方法
- 并配合多态使用,获得不同的工作状态。
#演示抽象类
class AC:
def cool_wind(self):
#制冷
pass
def hot_wind(self):
#制热
pass
def swing_l_r(self):
#左右摆风
pass
class Midea_AC(AC):
def cool_wind(self):
print("美的空调制冷")
def hot_wind(self):
print("美的空调制热")
def swing_l_r(self):
print("美的空调左右摆风")
class GREE_AC(AC):
def cool_wind(self):
print("格力空调制冷")
def hot_wind(self):
print("格力空调制热")
def swing_l_r(self):
print("格力空调左右摆风")
def make_cool(ac:AC):
ac.cool_wind()
midea_ac = Midea_AC()
gree_ac = GREE_AC()
make_cool(midea_ac)
make_cool(gree_ac)
#输出结果:
美的空调制冷
格力空调制冷
9.数据分析案例
- 要求:
- 某公司,有2份数据文件,现需要对其进行分析处理,计算每日的销售额并以柱状图表的形式进行展示。
- 数据内容:
- 1月份数据是普通文本,使用逗号分割数据记录,从前到后分别是(日期,订单id,销售额,销售省份)
- 2月份数据是JSON数据,同样包含(日期,订单id,销售额,销售省份)
- 需求分析:
- 读取数据 -> 封装数据对象 -> 计算数据对象 -> pyecharts绘图
- 设计FileReader类 ->设计数据封装类 -> 对对象进行逻辑计算 ->以面向对象思想重新认知pyecharts
数据文件大概格式如下:
在PyCharm中新建一个文件夹,文件夹中包含三个python文件(main.py,data_define.py,file_define.py):
main.py如下:
#实现步骤:
#1.设计一个类,可以完成数据的封装
#2.设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能
#3.读取文件,生产数据对象:
#4.进行数据需求的逻辑计算(计算每一天的销售额)
#5.通过pyecharts进行图形绘制
from file_define import FileReader,TextFileReader,JsonFileReader
from data_define import Record
from pyecharts.charts import Bar
from pyecharts.options import *
from pyecharts.globals import ThemeType
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()
#将2个月份的数据合并为1个list来储存
all_data : list[Record] = jan_data + feb_data
#进行数据计算
data_dict = {}
for record in all_data:
if record.date in data_dict.keys():
#当前日期已经有记录了,所以和老记录做累加即可
data_dict[record.date] += record.money
else:
data_dict[record.date] = record.money
#开始进行可视化图表开发
bar =Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))
bar.add_xaxis(list(data_dict.keys()))
bar.add_yaxis("销售额",list(data_dict.values()),label_opts=LabelOpts(is_show=False))
bar.set_global_opts(
title_opts=TitleOpts(title="每日销售额")
)
bar.render("每日销售额柱状图.html")
data_define.py如下:
"""
data_define.py
数据定义的类
"""
class Record: #记录数据的基本信息
def __init__(self,date,order_id,money,province):
self.date = date #订单日期
self.order_id = order_id #订单ID
self.money = money #订单金额
self.province = province #销售省份
def __str__(self):
return f"{self.date},{self.order_id},{self.money},{self.province}"
file_define.py如下:
"""
file_define.py
和文件相关的类定义
"""
import json
from data_define import Record
#先定义一个抽象类用来做顶层设计,确定有哪些功能需要实现
class FileReader:
def read_data(self) -> list[Record]:
"""读取文件的数据,读到的每一条数据都转换为Record对象,
将它们都封装到List内返回即可"""
pass
class TextFileReader(FileReader):
def __init__(self,path): #注意!!不要写成int
self.path = path #定义成员变量记录文件的路径
#复写(实现抽象方法)父类的方法
def read_data(self) -> list[Record]:
f = open(self.path,"r",encoding="UTF-8")
record_list = []
for line in f.readlines():
line = line.strip() #消除读取到的每一行数据中的\n
data_list = line.split(",")
record = Record(data_list[0],data_list[1],int(data_list[2]),data_list[3])
record_list.append(record)
f.close()
return record_list
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_list.append(record)
f.close()
return record_list
最终结果如下:
二、SQL 入门和实战
1.MySQL的安装和下载
MySQL下载与安装,地址:MySQL
下载安装包流程:DOWNLOADS -> MySQL Community (GPL) Downloads -> MySQL Installer for Windows -> 有两个安装包,选择体积较大的离线安装包(大概300+MB),点击Download -> 选择“No thanks,just start my download”
或者->直达地址:MySQL :: Begin Your Download
安装参考下文第二点:Mysql超详细安装配置教程(保姆级)_mysql安装及配置超详细教程-CSDN博客
配置环境变量:在环境变量->系统变量->Path->编辑,添加路径“D:\Program Files\MySQL\MySQL Server 8.0\bin”
验证有没有配置好:在命令提示符输入“mysql -uroot -p”,回车输入密码123456
* 遇到问题:'mysql' 不是内部或外部命令,也不是可运行的程序或批处理文件。
原因:可能是环境变量没点应用,确定完重新打开再输入就能运行了。
2.入门使用
2.1 常用操作语句:
- show databases; 查看有哪些数据库
- use 数据库名 使用某个数据库
- show tables 查看数据库内有哪些表
- exit 退出MySQL的命令行环境
2.2 第三方图形化软件DBeaver
使用命令提示符进行MySQL的操作不太方便,一般会使用第三方的图形化工具进行使用。
这里使用:DBeaver
下载地址:DBeaver Community | Free Universal Database Tool
下载过程:Download -> 下载免费版本DBeaver Community -> 下载window版本:Windows(installer)
* 在学习过程中遇到问题
使用DBeaver时显示:Connection refused: no further information
是数据库没有启动,数据库报错:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (10061)
解决方法:搜索计算机管理,在服务中启动MySQL。
3.SQL基础与DDL
3.1 SQL基础
SQL语言是操作数据库的专用工具。
所以,操作数据库的SQL语言,也基于功能,可以划分为4类:
- 数据定义:DDL(Data Definition Language)
- 库的创建除、表的创建除等
- 数据操纵:DML(Data Manipulation Language)
- 新增数据、删除数据、修改数据等
- 数据控制:DCL(Data Control Language)
- 新增用户、删除用户、密码修改、权限管理等
- 数据查询:DQL(Data Query Language)
- 基于需求查询和计算数据
SQL的语法特征:
- SQL语言,大小写不敏感
- SQL可以单行或多行书写,最后以;号(分号)结束
- SQL支持注释:
- 单行注释 :-- 注释内容( -- 后面一定要有一个空格)
- 单行注释:# 注释内容(#后面可以不加空格,推荐加上)
- 多行注释:/* 注释内容 */
3.2 DDL数据定义
1.DDL - 库管理
- 查看数据库
- SHOW DATABASES;
- 使用数据库
- USE 数据库名称;
- 创建数据库
- CREATE DATABASE 数据库名称 [CHARSET UTF8];
- 删除数据库
- DROP DATABASE 数据库名称;
- 查看当前使用的数据库
- SELECT DATABASE();
2.DDL - 表管理
- 查看有哪些表
- SHOW TABLES;
- 删除表
- DROP TABLE 表名称;
- DROP TABLE IF EXISTS 表名称;
- 创建表
- CREATE TABLE 表名称(
- 列名称 列类型,
- 列名称 列类型,
- );
4.DML
* SQL语句中的字符串要用 单引号
①数据插入INSERT
#基础语法:
insert into 表[(列1,列2,...,列n)] values(值1,值2,...,值n)[,(值1,值2,...,值n),...,(值1,值2,...,值n)]
#示例:
create table student(
id int,
name varchar(10),
age int
);
-- 只插入id这一列 --
insert into student(id) values(1),(2),(3);
-- 插入id,name,age三列
insert into student(id,name,age) values(4,'小明',18),(5,'小李',22);
-- student的列名可以不写,按顺序放入values就行
insert into student values(6,'小张',26),(7,'小陈',15);
上述SQL语句执行后,表结果如下:
②数据删除DELECT
#基础语法:
delete from 表名称 [where 条件判断];
#示例:
-- 删除id=1的数据
delete from student where id = 1;
③数据更新UPDATE
#基础语法:
update 表名 set 列=值 [where 条件判断];
#示例:
-- 把id = 6 的name设为“小李”
update student set name = '小李' where id = 6;
5.DQL基础查询
# 基础语法:
select 字段列表|* from 表 [where 条件判断];
#示例:
-- 查询id列
select id from student;
-- 查询所有列
select * from student;
-- 查询年龄大于20的
select * from student where age>20;
6.DQL分组聚合
group by关键字
#分组聚合语法:
select 字段|聚合函数 from 表 [where 条件] group by 列;
#聚合函数有:
-- sum(列) 求和
-- avg(列) 求平均值
-- min(列) 求最小值
-- max(列) 求最大值
-- count(列|*) 求数量
#示例:
-- 按照性别分组求年龄平均值
select gender,avg(age) from student group by gender;
* GROUP BY中出现了哪个列,哪个列才能出现在SELECT中的非聚合中。
7.DQL排序和分页
7.1 结果的排序
order by 关键字
#order by 结果排序语法:
select 列 | 聚合函数 | * from 表
where ...
group by ...
order by ... [asc | desc]
-- asc 升序 (默认是升序)
-- desc 降序
#示例:
-- 年龄大于20岁的学生,按照年龄升序排列
select * from student where age > 20 order by age asc;
7.2 结果分页限制
limit 关键字
#limit 结果分页限制语法:
select 列 | 聚合函数 | * from 表 -- 这行必写
where ... --从这往后的功能可选需要的写
group by ...
order by ... [asc | desc]
limit n[, m]
#示例:
-- 限制只输出5条
select * from student limit 5;
-- 表示跳过前10条,从第11条开始往后取8条
select * from student limit 10,8;
8.Python & MySQL
8.1 基础使用
除了使用图形化工具以外,我们也可以使用编程语言来执行SQL从而操作数据库。
在Python中,使用第三方库:pymysql来完成对MySQL数据库的操作。
安装:pip install pymysql
①执行非查询性质SQL
# 执行非查询性质SQL
from pymysql import Connection
#获取到MySQL数据库的链接对象
conn = Connection(
host="localhost", #主机名(IP)
port=3306, #端口
user="root", #账户
password="123456" #密码
)
# print(conn.get_server_info()) # 测试语句,测试是否有连接到,会打印版本号
cursor = conn.cursor() # 获取游标对象
conn.select_db("test") # 选择数据库
# 使用游标对象,执行sql
cursor.execute("create table test_pymysql(id int);")
#关闭链接
conn.close()
成功在数据库test中创建表test_pymysql:
②执行查询性质SQL
#执行查询性质SQL
from pymysql import Connection
#获取到MySQL数据库的链接对象
conn = Connection(
host="localhost", #主机名(IP)
port=3306, #端口
user="root", #账户
password="123456" #密码
)
cursor = conn.cursor() #获取游标对象
conn.select_db("test") #选择数据库
#使用游标对象,执行sql
cursor.execute("select * from student;")
#显示查询结果
result = cursor.fetchall()
for r in result:
print(r)
#关闭链接
conn.close()
8.2 数据插入
pymysql在执行数据插入或其它产生数据更改的SQL语句时,默认是需要提交更改的,即,需要通过代码“确认”这种更改行为。
通过链接对象.commit()即可确认此行为。或者在建立数据库连接里设置autocommit=True自动确认。
from pymysql import Connection
#获取到MySQL数据库的链接对象
conn = Connection(
host="localhost", #主机名(IP)
port=3306, #端口
user="root", #账户
password="123456", #密码
autocommit=True #自动提交(确认)
)
#执行非查询性质SQL
cursor = conn.cursor() #获取游标对象
conn.select_db("test") #选择数据库
#使用游标对象,执行sql
cursor.execute("insert into student values(10002,'小赵',17);")
# #通过commit确认
# conn.commit()
#关闭链接
conn.close()
9.综合案例
要求:使用《面向对象》章节案例中的数据,完成使用Python语言,读取数据,并将数据写入MySQL的功能。
使用DBeaver创建数据库:
create database py_sql charset utf8;
use py_sql;
create table orders(
order_date date,
order_id varchar(255),
money int,
province varchar(10)
);
file_define.py和data_define.py保持不变,依旧使用《面向对象》案例里的代码,将main.py进行添加修改:
"""
main.py
SQL综合案例,读取文件,写入MySQL数据库中
"""
from Python_learn import cursor
from file_define import FileReader,TextFileReader,JsonFileReader
from data_define import Record
from pymysql import Connection
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()
#将2个月份的数据合并为1个list来储存
all_data : list[Record] = jan_data + feb_data
#构建MySQL链接对象
conn = Connection(
host="localhost", #主机名(IP)
port=3306, #端口
user="root", #账户
password="123456", #密码
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.date}','{record.order_id}','{record.money}','{record.province}')"
#执行SQL语句
cursor.execute(sql)
#关闭MySQL链接对象
conn.close()
最终,数据库结果如下:
拓展:将写入到MySQl的数据,通过Python代码读取出来,写成一个json文件。
import json
from pymysql import Connection
#获取到MySQL数据库的链接对象
conn = Connection(
host="localhost", #主机名(IP)
port=3306, #端口
user="root", #账户
password="123456", #密码
autocommit=True #自动提交(确认)
)
#执行非查询性质SQL
cursor = conn.cursor() #获取游标对象
conn.select_db("py_sql") #选择数据库
#使用游标对象,执行sql
cursor.execute("select * from orders")
data_tuple = cursor.fetchall() #从数据库文件中提取元素
f = open("D:/sql_py_file.txt","a",encoding="UTF-8") #新建一个文件来存放读取的数据库数据
my_dict = {}
for record in data_tuple:
my_dict["data"] = str(record[0])
my_dict["order_id"] = record[1]
my_dict["money"] = int(record[2])
my_dict["province"] = record[3]
#写入文件
f.write(json.dumps(my_dict,ensure_ascii=False))
f.write("\n")
f.close()
#关闭链接
conn.close()
文件结果如下: