关系数据库-2-[mysql8]python3操作mysql

news2024/11/15 21:30:27

参考文档Python-PyMysql详解
参考文档使用pandas操作MySQL数据库
在这里插入图片描述

1 pymysql操作mysql

PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库。
PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。

pip install PyMySQL

1.1 连接数据库

import pymysql
# (1)数据库信息
class config(object):
    HOST = "localhost"
    PORT = 3306
    USERNAME = "root"
    PASSWORD = "xxxx"
    DBNAME = "test"

# 创建连接
con = pymysql.Connect(host=config.HOST,
                      port=config.PORT,
                      user=config.USERNAME,
                      passwd=config.PASSWORD,
                      db=config.DBNAME)

# 使用cursor()方法创建一个游标对象cursor
cur = con.cursor()

# 使用execute()方法执行SQL查询,获取数据库版本
cur.execute("SELECT VERSION()")

# 使用fetchone()方法获取单条数据.
data = cur.fetchone()

print(data)

# 关闭不使用的游标对象
cur.close()
# 关闭数据库连接
con.close()

输出如下:(‘8.0.19’,)。

1.2 创建数据表

如果数据库连接存在我们可以使用execute()方法来为数据库创建表,如下所示创建表EMPLOYEE:

import pymysql
# (1)数据库信息
class config(object):
    HOST = "localhost"
    PORT = 3306
    USERNAME = "root"
    PASSWORD = "xxxx"
    DBNAME = "test"

# 创建连接
con = pymysql.Connect(host=config.HOST,
                      port=config.PORT,
                      user=config.USERNAME,
                      passwd=config.PASSWORD,
                      db=config.DBNAME)

# 使用cursor()方法创建一个游标对象cursor
cur = con.cursor()

# 使用预处理语句创建表
sql_create = """CREATE TABLE EMPLOYEE (
         FIRST_NAME  CHAR(20) NOT NULL,
         LAST_NAME  CHAR(20),
         AGE INT,  
         SEX CHAR(1),
         INCOME FLOAT )"""

#执行sql语句
cur.execute(sql_create)

# 关闭不使用的游标对象
cur.close()
# 关闭数据库连接
con.close()

1.3 插入操作

1.3.1 普通的插入

以下实例使用执行SQL INSERT语句向表EMPLOYEE插入记录:

import pymysql
# (1)数据库信息
class config(object):
    HOST = "localhost"
    PORT = 3306
    USERNAME = "root"
    PASSWORD = "xxxx"
    DBNAME = "test"

# 创建连接
con = pymysql.Connect(host=config.HOST,
                      port=config.PORT,
                      user=config.USERNAME,
                      passwd=config.PASSWORD,
                      db=config.DBNAME)

# 使用cursor()方法创建一个游标对象cursor
cur = con.cursor()

# SQL 插入语句
sql_insert = """INSERT INTO EMPLOYEE(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME)
         VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
    # 执行sql语句
    cur.execute(sql_insert)
    # 提交到数据库执行
    con.commit()
except:
    # 如果发生错误则回滚
    con.rollback()

# 关闭不使用的游标对象
cur.close()
# 关闭数据库连接
con.close()

1.3.2 变量传值

import pymysql
# (1)数据库信息
class config(object):
    HOST = "localhost"
    PORT = 3306
    USERNAME = "root"
    PASSWORD = "xxxx"
    DBNAME = "test"

# 创建连接
con = pymysql.Connect(host=config.HOST,
                      port=config.PORT,
                      user=config.USERNAME,
                      passwd=config.PASSWORD,
                      db=config.DBNAME)

# 使用cursor()方法创建一个游标对象cursor
cur = con.cursor()

first_name='lucy'
last_name='kalt'
age=22
sex='M'
income=1800

# SQL 插入语句
sql_insert = """INSERT INTO EMPLOYEE(FIRST_NAME,
       LAST_NAME, AGE, SEX, INCOME)
       VALUES ('{}','{}',{},'{}',{})""".format(first_name, last_name, age, sex, income)
print(sql_insert)
try:
   # 执行sql语句
   cur.execute(sql_insert)
   # 执行sql语句
   con.commit()
except:
   # 发生错误时回滚
   con.rollback()

# 关闭不使用的游标对象
cur.close()
# 关闭数据库连接
con.close()

1.3.3 批量写入

通过python向mysql插入大量数据时,可以有两种方法:
1、for + cursor.execute(sql),最后集中提交commit()。
2、cursor.executemany(sql,list)。
两种方法效率上和功能上有一定差异。26万条数据,使用第一种方法需要约1.5小时,使用第二种方法只需要10几秒。

import pymysql
# (1)数据库信息
class config(object):
    HOST = "localhost"
    PORT = 3306
    USERNAME = "root"
    PASSWORD = "xxxx"
    DBNAME = "test"

# 创建连接
con = pymysql.Connect(host=config.HOST,
                      port=config.PORT,
                      user=config.USERNAME,
                      passwd=config.PASSWORD,
                      db=config.DBNAME)

# 使用cursor()方法创建一个游标对象cursor
cur = con.cursor()

# 必须是元组列表的格式
list_1 = [('lily','kalt',22,'M',1900),('jim','kalt',22,'M',2000)]

# SQL 插入语句
# 注意,这里的%s不需要加引号,使用execute需要加引号。
# 另外,executemany 在执行过程中能够将python的None转为sql的null,这一点很方便。
sql_1 = """insert into EMPLOYEE(FIRST_NAME,
       LAST_NAME, AGE, SEX, INCOME) values(%s,%s,%s,%s,%s)""" 

try:
   # 执行sql语句
   cur.executemany(sql_1,list_1)
   # 执行sql语句
   con.commit()
except:
   # 发生错误时回滚
   con.rollback()

# 关闭不使用的游标对象
cur.close()
# 关闭数据库连接
con.close()

1.4 查询操作

Python查询Mysql使用fetchone()方法获取单条数据, 使用fetchall()方法获取多条数据。
fetchone(): 该方法获取下一个查询结果集。结果集是一个对象。
fetchall(): 接收全部的返回结果行.
rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。

1.4.1 返回元组

import pymysql
# (1)数据库信息
class config(object):
    HOST = "localhost"
    PORT = 3306
    USERNAME = "root"
    PASSWORD = "xxxx"
    DBNAME = "test"

# 创建连接
con = pymysql.Connect(host=config.HOST,
                      port=config.PORT,
                      user=config.USERNAME,
                      passwd=config.PASSWORD,
                      db=config.DBNAME)

# 使用cursor()方法创建一个游标对象cursor
cur = con.cursor()

# SQL 查询语句
sql_select = "SELECT * FROM EMPLOYEE \
       WHERE INCOME > %s" % (1000)
try:
    # 执行SQL语句
    cur.execute(sql_select)
    # 获取所有记录列表,以元组来存储
    results = cur.fetchall()
    print(results)
    # 遍历元组存值
    for row in results:
        fname = row[0]
        lname = row[1]
        age = row[2]
        sex = row[3]
        income = row[4]
        # 打印结果
        print("fname={},lname={},age={},sex={},income={}".format(fname, lname, age, sex, income))
except:
    print("错误:没有查找到数据")

# 关闭不使用的游标对象
cur.close()
# 关闭数据库连接
con.close()

1.4.2 转为DataFrame

返回的results可以直接转换为DataFrame。

import pandas as pd
# 指定好列名
df = pd.DataFrame(results,columns=["fname","lname","age","sex","income"])
print(df)

1.5 更新操作

更新操作用于更新数据表的数据,以下实例将表中SEX为 ‘M’ 的AGE字段递增 1:

import pymysql
# (1)数据库信息
class config(object):
    HOST = "localhost"
    PORT = 3306
    USERNAME = "root"
    PASSWORD = "xxxx"
    DBNAME = "test"

# 创建连接
con = pymysql.Connect(host=config.HOST,
                      port=config.PORT,
                      user=config.USERNAME,
                      passwd=config.PASSWORD,
                      db=config.DBNAME)

# 使用cursor()方法创建一个游标对象cursor
cur = con.cursor()

# SQL 更新语句
sql_update = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '{}'".format('M')
try:
   # 执行SQL语句
   cur.execute(sql_update)
   # 提交到数据库执行
   con.commit()
except:
   # 发生错误时回滚
   con.rollback()

# 关闭不使用的游标对象
cur.close()
# 关闭数据库连接
con.close()

1.6 删除操作

删除操作用于删除数据表中的数据,以下实例演示了删除数据表 EMPLOYEE 中 AGE 大于 22 的所有数据:

import pymysql
# (1)数据库信息
class config(object):
    HOST = "localhost"
    PORT = 3306
    USERNAME = "root"
    PASSWORD = "xxxx"
    DBNAME = "test"

# 创建连接
con = pymysql.Connect(host=config.HOST,
                      port=config.PORT,
                      user=config.USERNAME,
                      passwd=config.PASSWORD,
                      db=config.DBNAME)

# 使用cursor()方法创建一个游标对象cursor
cur = con.cursor()

# SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > {}".format(22)
try:
   # 执行SQL语句
   cur.execute(sql)
   # 提交修改
   con.commit()
except:
   # 发生错误时回滚
   con.rollback()

# 关闭不使用的游标对象
cur.close()
# 关闭数据库连接
con.close()

1.7 执行事务

事务机制可以确保数据一致性。
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
(1)原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
(2)一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
(3)隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
(4)持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
Python DB API 2.0 的事务提供了两个方法 commit 和 rollback。

# SQL删除记录语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
try:
   # 执行SQL语句
   cur.execute(sql)
   # 向数据库提交
   con.commit()
except:
   # 发生错误时回滚
   con.rollback()

对于支持事务的数据库, 在Python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。commit()方法提交游标的所有更新操作,rollback()方法回滚当前游标的所有操作。每一个方法都开始了一个新的事务。

1.8 自动提交

在创建连接的时候,增加参数 autocommit = 1 ,当发生update等操作时,会实时更新到数据库内。否则要通过 conn.commit() 来提交到数据库进行具体操作。

如果没有设置自动提交,也没有手动提交,当进行插入或更新等操作时,只在本地客户端能看到更新,在其他客户端或数据库内,数据无变化。


# 实时操作,适合随时少量、频繁的更新
 
import pymysql
con = pymysql.connect(
	host='XXX.XXX.XXX.XXX', 
	user='XXXXX', 
	password='XXXXX', 
	db='XXXXX', 
	port=3306, 
	charset='utf8',
	autocommit = 1 ,
	)
 
# 集中大批量操作数据
 
import pymysql
con = pymysql.connect(
	host='XXX.XXX.XXX.XXX', 
	user='XXXXX', 
	password='XXXXX', 
	db='XXXXX', 
	port=3306, 
	charset='utf8',
	)
 
SQl相关操作略
 
con.commit()  # 提交

2 pandas操作mysql

使用PyMySQL包获取的数据为元组或者字典格式,如果要做进一步的处理,还需要转换成pandas的DataFrame格式,比较麻烦。而直接用pandas的read_sql_query()函数可以直接得到DataFrame格式的数据,而且同样可以对表进行增删改查的操作。

2.1 连接数据库

import pymysql
import pandas as pd
import sqlalchemy

# (1)数据库信息
class config(object):
    HOST = "localhost"
    PORT = 3306
    USERNAME = "root"
    PASSWORD = "xxxx"
    DBNAME = "test"

#创建数据库的连接引擎
# 例如'mysql+pymysql://root:4869@127.0.0.1:3306/question?charset=utf8'需要结合import pymysql
# 例如'mysql://用户名:密码@主机名或IP地址:端口/库名称?charset=utf8'需要结合import MySQLdb 
con_str = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(config.USERNAME,config.PASSWORD,config.HOST,config.PORT,config.DBNAME)
# con_str = 'mysql://{}:{}@{}:{}/{}?charset=utf8'.format(config.USERNAME,config.PASSWORD,config.HOST,config.PORT,config.DBNAME)
engine=sqlalchemy.create_engine(con_str )

2.2 读取数据

sql可以是表名称,读取该表所有数据存为dataframe, sql也可以是一句可以执行的sql语句,比如select语句。

2.2.1 pd.read_sql()

(1)表名称

df = pd.read_sql(sql='employee', con=engine)  
print(df)

(2)执行sql语句

sql_str = "select * from employee"
df1 = pd.read_sql(sql=sql_str, con=engine)  
print(df1)

2.2.2 pd.read_sql_query()

只能是sql语句

sql_str = "select * from employee"
df1 = pd.read_sql_query(sql=sql_str, con=engine)  
print(df1)

read_sql_query()函数还有一些其他的参数:
coerce:尝试将非字符串及非数值对象转换成浮点数字,默认为True
params:可以是列表、字典、元组,用于存储动态拼接SQL命令的变量
parse_dates:将指定字段解析成日期格式
chunksize:如果不设置,返回的是DataFrame对象

2.3 写入数据

df.to_sql(name='tablename', con=engine, if_exists='append', index=False, chunksize=1000)
(1)name 指定的是目标数据库表
(2)con 与数据库链接的方式,推荐使用sqlalchemy的engine类型
(3)if_exists 当数据库中已经存在数据表时对数据表的操作,有replace替换、append追加,fail则当表存在时提示ValueError
(4)index 对DataFrame的index索引的处理,=True时索引也将作为数据写入数据表
(5)chunsize 整数,一次写入数据时的数据行数量

如果没有表,会自动创建表,其字段类型可能不符合要求,所以还是提前创建。
列名对应表中的字段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171044.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在线教育-谷粒学院学习笔记(八)

文章目录1 内容介绍2 微服务3 微服务实现删除nacos4 删除课程-删除视频5 Hystrix1 内容介绍 Spring Colud 删除小节-删除视频删除课程-删除视频 2 微服务 service 三个服务 service_edu 8001service_oss 8002service_vod 8003 微服务 微服务是架构风格把一个项目拆分成多个…

NUMA介绍

早期CPU访问内存结构 UMA1(Uniform Memory Access, 一致性内存访问 ) 早期的计算机,内存控制器还没有整合进 CPU,所有的内存访问都需要经过北桥芯片来完成。 在 UMA 架构下,CPU 和内存之间的通信全部都要通过前端总线…

【Java|golang】2293. 极大极小游戏

给你一个下标从 0 开始的整数数组 nums ,其长度是 2 的幂。 对 nums 执行下述算法: 设 n 等于 nums 的长度,如果 n 1 ,终止 算法过程。否则,创建 一个新的整数数组 newNums ,新数组长度为 n / 2 &#x…

go语言初识——数据类型

目录 go go与C语言区别 helloworld 数据类型 变量 定义 类型推导 简短声明 : 匿名变量 常量 iota 基本类型 指针 数组 结构体 go Go是2009年开源的编程语言,Go语言具有以下特性:语法简洁、并发编程、编译迅速、数组安全、丰富的内置类型…

如何在 Antd Pro 框架上实现样式自定义?

文章目录一、前言二、实操过程一、前言 Ant Design Pro 是一个企业级中后台前端/设计解决方案,已经有完善的 UI 组件及设计风格,在一些特定项目中,往往涉及到对其调整,来实现独特的 UI 设计,如不同的主题色、布局、卡…

帮助台技术员协助的自助服务

对于帮助台技术员例行电话带来成本高居不下的企业来说,最终用户自助服务是一个伟大的解决方案,允许用户解决自己的IT问题。然而,一些企业仍未部署自助服务。例如,即使在Active Directory中维护每个员工的最新个人资料信息是一件乏…

1. Python3的安装与环境搭建

1. 开发环境:Win10 Python3.10.5 PyCharm 2. 安装Python3 下载地址:https://www.python.org/ 运行刚下载的python-3.10.5-amd64.exe,并做以下操作: 然后Next,并进行以下操作: 最后点击Install&#…

会话跟踪技术:Cookie、Session和Token

会话跟踪技术背景:1. Cookie (客户端的会话跟踪技术)1.1 原理1.2 基本使用1.2.1 服务器发送Cookie1.2.2 服务器获取Cookie1.3 使用细节1.3.1 存活时间1.3.2 存储中文2. Session(服务端的会话跟踪技术)2.1 原理2.2 基本…

采用高通Qualcomm处理器的手机进EDL 9008模式的办法

由于我们有很多基于 Qualcomm 的设备,其中一些设备可能会古怪地猜测如何进入 EDL 模式,或者如何正确进入。 例如,对于 Alcatel,您必须先按住两个音量键,然后再按住其中一个,对于 CAT B35,您必须…

Python基础(二十六):模块和包简单介绍

文章目录 模块和包简单介绍 一、模块 1、导入模块 2、制作模块

基于Servlet+jsp+mysql开发javaWeb校园图书管理系统

你知道的越多,你不知道的越多 点赞再看,养成习惯 如果您有疑问或者见解,或者没有积分想获取项目,欢迎指教: 企鹅:869192208 文章目录一、开发背景二、 需求分析三、开发环境四、运行效果五、开发流程工程目…

【Android安全】Google Hardware-backed Keystore | SafetyNet | 远程证明Remote Attestation

Google Hardware-backed KeyStore Attestation 原理及流程 SafetyNet Hardware-backed Attestation SafetyNet Hardware-backed Attestation:使用了Hardware-backed Keystore SafetyNet 支持Software Attestation 和 Hardware-backed Attestation,根据…

五、Web应用开发模式

web应用开发模式 web应用的开发主要有两种模式: 前后端不分离前后端分离 前后端不分离 在互联网早期,web应用开发采用前后端不分离的方式。 它是以后端直接渲染模板完成响应的一种开发模式。 以前后端不分离的方式开发的web应用的架构图如下&#x…

每天15分钟JMeter进阶篇(1):JAVA 取样器的基本使用

每天15分钟JMeter进阶篇(1):JAVA 取样器的基本使用前言准备工作创建开发工程POM文件创建根工程创建module开发JAVA取样器构建、部署运行构建JAR包部署和运行写在最后前言 JMETER官方提供了丰富的取样器,可以支持80%的常见测试场景…

传输层协议:UDP协议

简介 用户数据报协议(英语:User Datagram Protocol,缩写:UDP;又称用户数据包协议)是一个简单的面向数据包的通信协议,位于OSI模型的传输层。该协议由David P. Reed在1980年设计且在RFC 768中被…

CrimeFragment的UI fragment进行管理

用户界面将由一个名为CrimeFragment的UI fragment进行管理。CrimeFragment的 实例将通过一个名为CrimeActivity的activity来托管。CrimeActivity视图由FrameLayout组件组成,FrameLayout组件为CrimeFragment要显示 的视图安排了存放位置。 CrimeFragment 的视图由一个…

Thinkphp QVD-2022-46174 多语言rce

文章目录漏洞介绍vulhub漏洞搭建漏洞利用利用一:写入文件利用二:文件包含漏洞分析参考文章漏洞介绍 Thinkphp,v6.0.1~v6.0.13,v5.0.x,v5.1.x 如果 Thinkphp 程序开启了多语言功能,那就可以通过 get、head…

[从零开始]用python制作识图翻译器·三

AlsoEasy-RecognitionTranslator具体实现开发环境准备和验证下载conda创建开发环境文字识别模块在线模块离线模块机器翻译模块在线模块离线模块GUIGUI-定位模块GUI-截图模块具体实现 开发环境准备和验证 前期测试项目文件已上传到我的仓库。 下载conda conda是python的版本管…

Day863.协程 -Java 并发编程实战

协程 Hi,我是阿昌,今天学习记录的是关于协程的内容。 Java 语言里解决并发问题靠的是多线程,但线程是个重量级的对象,不能频繁创建、销毁,而且线程切换的成本也很高,为了解决这些问题,Java SD…

C++设计模式(4)——策略模式

策略模式 亦称: Strategy 意图 策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。 问题 一天, 你打算为游客们创建一款导游程序。 该程序的核心…