Python入门(2):第二阶段——面向对象

第一阶段入门:Python入门(1)——第一阶段_python最新的解释器-CSDN博客

 

 ——     第二阶段     —— 

目录

 ——     第二阶段     —— 

一、面向对象

1.类的成员方法

2.类和对象

3.构造方法

4.其他内置方法 

5.封装

6.继承

6.1 继承的基础语法 

6.2 复写和使用父类成员

7.类型注解

 8.多态

 9.数据分析案例

二、SQL 入门和实战

1.MySQL的安装和下载

 2.入门使用

 3.SQL基础与DDL

3.1 SQL基础

3.2 DDL数据定义

4.DML

5.DQL基础查询

6.DQL分组聚合

7.DQL排序和分页

7.1 结果的排序

7.2 结果分页限制

8.Python & MySQL

8.1 基础使用

8.2 数据插入

9.综合案例


一、面向对象

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

文件结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值