Python操作之MySQL

2023-11-15

目录

安装PyMySQL

PyMySQL操作mysql步骤

创建表格

连接Mysql

游标

事务特性

事务提交

查数据库

增删数据库

封装mysql类

错误处理

总结


安装PyMySQL

在使用Python中我们都要安装相关的库,mysql在python经常使用的库为PyMySQL,安装如下:

pip install PyMySQL

PyMySQL操作mysql步骤

1.创建连接。使用PyMySQL模块提供的‘connect’函数连接mysql,返回一个`Connection`对象

2.获取游标。连接mysql成功之后,我们可以通过通过连接对象的`cursor`方法获取游标(`Cursor`)对象

3.生产需要的数据库语句

3.执行Mysql语句。通过游标对象的`execute`方法来执行我们所想执行的mysql语句,并返回结果,需要根据实际情况提交或回滚事务。

4.关闭游标。

4.关闭数据库连接

流程图如下:

实例代码如下:

import  pymysql
#连接数据库
conn=pymysql.connect(host='localhost',user='ian',password='ian123',database='ian',charset='utf8')
# 创建游标
cur=con.cursor()
# 生成数据库
sql='select * from tb_test'
#获取结果
cur.execute(sql)
# 获取所有记录  fetchall--获取所有记录   fetchmany--获取多条记录,需传参  fetchone--获取一条记录
all=cur.fetchall()
# 输出查询结果
print(all)
# 关闭游标
cur.close()
# 关闭数据库连接,目的为了释放内存
conn.close()

创建表格

在我们使用数据库之前,首先我们得有数据库,那么如何创建呢?如下:

-- 创建名为ian的数据库并指定默认的字符集
create database `ian` default character set utf8mb4;

-- 切换到ian数据库
use `ian`;

-- 创建表
create table `tb_test`
(
`no` int not null comment '编号',
`name` varchar(10) not null comment '名称',
`loc` varchar(20) not null comment '所在地',
primary key (`no`)
);

-- 插入4个数据
insert into `tb_test` values 
    (1, 'test1', '北京'),
    (2, 'test2', '上海'),
    (3, 'test3', '仙'),
    (4, 'test4', '深圳');

连接Mysql

在python中我们通过`connect`函数连接 MySQL 服务器,该函数会返回一个`Connection`对象

connect(host='localhost',port=3306,user='ian',password='ian123',db='n',charset='utf8')

connect的参数列表解释如下:

  1. host:连接的数据库服务器主机名,默认为本地localhost
  2. usr:连接数据库的用户名,默认为当前
  3. passwd:连接数据库的密码,无默认值
  4. db:连接的数据库名,无默认值
  5. conv:将文件映射到python类型的字典,默认为MySQLdb.converters.conversion
  6. cursorclass:cursor()使用的种类,默认值为MySQLdb.cursors.Cursor
  7. compress:启用协议压缩功能
  8. named_pipe:在windows中,与一个命名管道相连接
  9. init_command:一旦连接建立,就为数据库服务器指定一条语句来运行
  10. read_default_file:使用指定的MySQL配置文件
  11. read_default_group:读取的默认组。
  12. unix_socket:在unix中,连接使用的套接字,默认使用TCP。
  13. port:指定数据库服务器的连接端口,默认是3306。
  14. charset:表示连接使用的字符集 

但是为了让程序更加健壮,我们一般不会这样调用该函数,先不说麻烦与否,如果我们经常要修改连接参数,那么我们所有调用地方都会修改,这样的代码十分不健壮。所以我们应该使用模块化进行解决,代码如下:

import pymysql

def connect_mysql():
    db_config = {
        'host':'127.0.0.1',
        'port':3306,
        'user':'ian',
        'password':'ian123',
        'charset':'utf8'
    }
    conn = pymysql.connect(**db_config)
    return conn

游标

游标是系统为用户开设的一个数据缓存区,存放SQL语句执行的结果,用户可以用SQL语句逐一从游标中获取记录,并赋值给变量,交由Python进一步处理。

在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。

正如前面我们使用Python对文件进行处理,那么游标就像我们打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。

事务特性

事务有以下四个标准属性的缩写ACID,通常被称为:Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性)

原子性: 确保工作单元内的所有操作都成功完成,否则事务将被中止在故障点,和以前的操作将回滚到以前的状态。

一致性: 确保数据库正确地改变状态后,成功提交的事务。

隔离性: 使事务操作彼此独立的和透明的。

持久性: 确保提交的事务的结果或效果的系统出现故障的情况下仍然存在

事务提交

python中事务提交的三种方法:

1. autocommit=True   在连接数据库时,就设置自动提交事务

2.conn.autocommit(True)  在执行sql语句之前,设置自动提交

3.conn.commit()   执行sql语句之后,提交

代码如下:

import pymysql

def connect_mysql():
    db_config = {
        'host':'127.0.0.1',
        'port':3306,
        'user':'ian',
        'password':'ian123',
        'charset':'utf8',
        'autocommit':True     #第一种方法
    }
    conn = pymysql.connect(**db_config)
    return conn

conn = connect_mysql()
#conn.autocommit(True)   #第二种方法
cur = conn.cursor()
sql = "insert into tb_test values (5, 'test5', '桂林')"
cur.execute(sql)
#conn.commit()   #第三种方法

cur.close()
conn.close()

查数据库

获取查询结果函数如下:

fetchone获取一行

fetchmany获取多行

fetchall获取所有

import  pymysql
#连接数据库
conn=pymysql.connect(host='localhost',user='ian',password='ian123',database='ian',charset='utf8')
# 创建游标
cur=con.cursor()
# 生成数据库
sql='select * from tb_test'
#获取结果
cur.execute(sql)
# 获取所有记录  fetchall--获取所有记录   fetchmany--获取多条记录,需传参  fetchone--获取一条记录
all=cur.fetchall()
# 输出查询结果
print(all)
for row in all:
      no= row[0]
      name = row[1]
      loc= row[2]
      # 打印结果
      print "no=%s,name =%s,loc=%s" %(no, name , loc)
# 关闭游标
cur.close()
# 关闭数据库连接,目的为了释放内存
conn.close()

增删数据库

增删改,操作方式都一样,只是mysql语句的不同,返回的值是影响的行数。需要注意的是,我们需要提交事务,如果不提交事务,语句是不执行的,只是显示执行成功,但是表中并没有进行相关操作。代码如下:

import pymysql

def insert_mysql():
    no = int(input('编号: '))
    name = input('名称: ')
    location = input('所在地: ')

    # 1. 创建连接
    conn = pymysql.connect(host='127.0.0.1', port=3306,
                       user='ian', password='ian123',
                       database='test', charset='utf8')
    try:
        # 2. 获取游标对象
        with conn.cursor() as cursor:
            # 3. 通过游标对象向数据库服务器发出SQL语句
            affected_rows = cursor.execute(
                'insert into `tb_test` values (%s, %s, %s)',
                (no, name, location)
            )
            if affected_rows == 1:
                print('新增成功!!!')
        # 4. 提交事务
        conn.commit()
    except pymysql.MySQLError as err:
        # 4. 回滚事务
        conn.rollback()
        print(type(err), err)
    finally:
        # 5. 关闭连接释放资源
        conn.close()

def del_mysql():
    no = int(input('编号: '))

    # 1. 创建连接
    conn = pymysql.connect(host='127.0.0.1', port=3306,
                       user='ian', password='ian123',
                       database='test', charset='utf8',
                       autocommit=True)
    try:
        # 2. 获取游标对象
        with conn.cursor() as cursor:
            # 3. 通过游标对象向数据库服务器发出SQL语句
            affected_rows = cursor.execute(
                'delete from `tb_dept` where `dno`=%s',
                (no, )
        )
            if affected_rows == 1:
                print('删除成功!!!')
    finally:
        # 5. 关闭连接释放资源
        conn.close()

insert_mysql()
del_mysql()

封装mysql类

import pymysql
from pathlib import Path

class ConnectMsql:
    def __init__(self, host='127.0.0.1', port=3306, user='ian',
                 password='ian123', database="test", filename: str = "test.sql"):
        """
        :param host:        域名
        :param port:        端口
        :param user:        用户名
        :param password:    密码
        :param database:    数据库名
        :param filename:    文件名称
        """

        self._host: str = host
        self._port: int = port
        self._user: str = user
        self._password: str = password
        self._database: str = database
        self._file_path = Path(__file__).parent.joinpath(filename)

    def _show_databases_and_create(self):
        """
        查询数据库是否存在,不存在则进行新建操作
        :return:
        """
        connection = pymysql.connect(host=self._host, port=self._port, user=self._user, password=self._password,
                                     cursorclass=pymysql.cursors.DictCursor)
        with connection:
            with connection.cursor() as cursor:
                cursor.execute('show databases;')
                result = cursor.fetchall()
                results = self._database not in tuple(x["Database"] for x in result)

        if results:
            with connection.cursor() as cursor:
                cursor.execute(f'create database {self._database};')
            with connection.cursor() as cursor:
                cursor.execute('show databases;')
                result = cursor.fetchall()
                results = self._database in tuple(x["Database"] for x in result)
            return results if results else result
        else:
            return True

    def _export_databases_data(self):
        """
        读取.sql文件,解析处理后,执行sql语句
        :return:
        """
        if self._show_databases_and_create() is True:
            connection = pymysql.connect(host=self._host, port=self._port, user=self._user, password=self._password,
                                         database=self._database, charset='utf8')
            # 读取sql文件,并提取出sql语句
            results, results_list = "", []
            with open(self._file_path, mode="r+", encoding="utf-8") as r:
                for sql in r.readlines():
                    # 去除数据中的“\n”和“\r”字符
                    sql = sql.replace("\n", "").replace("\r", "")
                    # 获取不是“--”开头且不是“--”结束的数据
                    if not sql.startswith("--") and not sql.endswith("--"):
                        # 获取不是“--”的数据
                        if not sql.startswith("--"):
                            results = results + sql

                # 根据“;”分割数据,处理后插入列表中
                for i in results.split(";"):
                    if i.startswith("/*"):
                        results_list.append(i.split("*/")[1] + ";")
                    else:
                        results_list.append(i + ";")

            # 执行sql语句
            with connection:
                with connection.cursor() as cursor:
                    # 循环获取sql语句
                    for x in results_list[:-1]:
                        # 执行sql语句
                        cursor.execute(x)
                        # 提交事务
                        connection.commit()
                    else:
                        return "sql全部语句执行成功 !"

    @property
    def sql_run(self):
        """
        执行方法
        :return:
        """
        return self._export_databases_data()

if __name__ == '__main__':
    res = ConnectMsql().sql_run
    print(res)

错误处理

DB API中定义了一些数据库操作的错误及异常,下表列出了这些错误和异常:

总结

该文章只是简单介绍一下python中怎么样使用mysql,但对mysql更多的知识没有进行详细的介绍,我想后面再专门使用一些章节给大家介绍。如果有不足的地方希望大家可以指出,希望可以帮到大家。谢谢大佬们啦,觉得还行也可以点个赞关注哦!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python操作之MySQL 的相关文章

  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 从 scikit-learn 导入 make_blobs [重复]

    这个问题在这里已经有答案了 我收到下一个警告 D Programming Python ML venv lib site packages sklearn utils deprecation py 77 DeprecationWarning
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • APEX 安装失败,PLS-00201:必须声明标识符“SYS.DBMS_DB_VERSION”

    尝试在 Oracle XE 18c 数据库上安装 Oracle APEX 20 2 如下官方说明 https docs oracle com en database oracle application express 20 1 htmig
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • 使用 OpenPyXL 迭代工作表和单元格,并使用包含的字符串更新单元格[重复]

    这个问题在这里已经有答案了 我想使用 OpenPyXL 来搜索工作簿 但我遇到了一些问题 希望有人可以帮助解决 以下是一些障碍 待办事项 我的工作表和单元格数量未知 我想搜索工作簿并将工作表名称放入数组中 我想循环遍历每个数组项并搜索包含特
  • 将古吉拉特语文本插入 MySQL 表会产生垃圾字符和不可读的文本

    我有三个 MySQL 表 我正在向其中插入古吉拉特语内容 当我插入两个表时 它们插入得很好并且可读 但在一个表中 它显示垃圾字符 不可读的文本 我怎样才能解决这个问题 MySQL 有每个表的字符集设置 http dev mysql com
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 对输入求 Keras 模型的导数返回全零

    所以我有一个 Keras 模型 我想将模型的梯度应用于其输入 这就是我所做的 import tensorflow as tf from keras models import Sequential from keras layers imp
  • Mysql 创建定义器

    我创建了一个在 CentOS Web 服务器上运行的 Intranet Web 应用程序 该应用程序使用另一个本地服务器 始终是 CentOS 作为 MySQL 数据库 在数据库内部我创建了例程 这些例程总是这样开始 CREATE DEFI
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • PTA 7-76 寻找完美数*

    PTA 7 76 寻找完美数 所有真因子之和小于其本身的数称为亏数 如 4 的真因子 1 2 之和为 3 小于 4 是亏数 所有真因子之和大于其本身的数称为盈数 如 12 的真因子 1 2 3 4 6 之和为 16 大于 12 是盈数 不盈
  • throttle-debounce 节流和防抖

    目录 1 区别 2 使用 3 实现 3 1 debounce 3 2 throttle 4 意外收获 throttle节流 debounce防抖 1 区别 假设时间频率 1s throttle 是每隔 1s 必然执行 高铁不能人 到点就发车
  • 八进制在计算机系统中的应用场景,二进制、八进制、十进制、十六进制都能干什么? 十六进制计算器使用场景...

    二进制 二进制如今主要用在电子技术的数字电路中 比如我们经常使用的计算机能够识别的语言就是二进制语言 数字电路中的高 低电平 导通 截止 开 关 有 无 真 假等等都是二进制表示 二进制的逻辑电路使用0和1表示 八进制 十进制 十六进制 八
  • springboot 源码_springboot源码解析

    1 springboot是什么 脚手架 纵观框架的发展过程 最终由springboot出来做了SSM的整合 方便程序员偷懒 因为SSM整合过程中有很多的配置 很多的依赖 很容易出错 也不方便快速开发 2 spring创建对象的过程 图解 开
  • Air Raid

    http poj org problem id 1422 Description 例如 Consider a town where all the streets are one way and each street leads from
  • 比double精度更高的数据类型_MySQL 数据类型之浮点

    基本数据类型 为什么明确数据类型 不同数据类型大小不同 明确了数据类型之后 可以帮助使用者进行类型检查 明确存储空间大小 明确操作是否合理 从手册上来看 基本的数据类型包括 日期与时间 05 27 2020 字符串 abcd 空间数据 JS
  • hadoop-for-windows

    http dongxicheng org mapreduce hadoop for windows
  • 使用ftp服务上传文件时553报错的解决(绝对有用)

    使用ftp服务上传文件时553报错的解决 在使用ftp上传本地文件时 会遇到553的报错 以下是我总结的解决方法 1 使用本地用户登陆时 在使用本地用户登陆ftp服务上传文件时 如果遇到553的报错 一般来说可能有两种原因 原因1 本地文件
  • Linux用户态和内核态

    1 用户态和内核态的概念区别 究竟什么是用户态 什么是内核态 这两个基本概念以前一直理解得不是很清楚 根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上 先看一个例子 1 例子 void
  • 一文讲透!Windows内核 & x86中断机制详解

    搞内核研究的经常对中断这个概念肯定不陌生 经常我们会接触很多与中断相关的术语 按照软件和硬件进行分类 硬件CPU相关 IRQ IDT cli sti 软件操作系统相关 APC DPC IRQL 一直以来对中断这一部分内容弄的一知半解 操作系
  • Hive报错:Hive JDBC:Permission denied: user=anonymous, access=EXECUTE, inode=”/tmp”

    1 美图 今天使用JDBC来操作Hive时 首先启动了hive远程服务模式 hiveserver2 表示后台运行 然后到eclipse中运行程序时出现错误 Permission denied user anonymous access EX
  • Java web编写的志愿者系统(志愿者网络平台) 功能齐全、下载后即可以运行

    8月份由于公司的事情太多 基本上没有更新博客信息 今天稍微空了点 陆续为为大家介绍Java web项目 今天要介绍的是一个Java web编写的志愿者系统 志愿者系统通常是由非盈利组织或者政府机构建立和运营的 用于管理和协调志愿者的各种活动
  • How to delete local branches of GitExtension

    How to delete local branches of GitExtension Jin Qing s Column Dec 2021 GitExtension is a good tool After a long time of
  • 【trajectory optimization】1 intro

    满足所有constraints 的是feasible solution可行解 admissible control 容许控制 可行控制 轨迹优化是根据目标函数objective function 描述寻找最优轨迹optimal trajec
  • 【C语言】14个常用的字符串函数和内存函数

    文章目录 一 strlen 1 函数原型 2 使用介绍 3 三种模拟实现 计数器法 利用递归 指针相减 二 strcpy 1 函数原型 2 使用介绍 3 模拟实现 三 strcat 1 函数原型 2 使用介绍 3 模拟实现 四 strcmp
  • 论文笔记:COST: CONTRASTIVE LEARNING OF DISENTANGLEDSEASONAL-TREND REPRESENTATIONS FORTIME SERIES FOREC

    ICLR 2022 1 前言介绍 表征学习 对比学习 时间序列预测 首先学习时间序列解耦的representation 然后进行回归任务的精调 对比学习CoST包含时域和频域的contrastive loss gt 学习趋势和周期性repr
  • 【C++初阶】类和对象(下)

    一 再谈构造函数 构造函数其实分为 1 函数体赋值 2 初始化列表 之前所讲到的构造函数其实都是函数体赋值 那么本篇文章将会具体讲述初始化列表 初始化列表 语法 以一个冒号开始 接着是一个以逗号分隔的数据成员列表 每个 成员变量 后面跟 一
  • 2021年蓝桥杯

    专栏 蓝桥杯题目 一 卡片问题 题目解析 由于数据量比较小 直接暴力枚举即可 依题意可以很快知道 卡片最先用完的数是 1 因此遍历足够多的数 将每个数转换成字符类型 计算每个字符里面 1 的个数 注意 1 用完可能不是临界条件 有可能下一个
  • 傻瓜攻略(一)——MATLAB主成分分析(PCA)代码及结果分析实例

    主成分分析 收藏的能不能顺手点个赞啊 嘿嘿 主成分分析法 PCA 是一种高效处理多维数据的多元统计分析方法 将主成分分析用于多指标 变量 的综合评价较为普遍 笔者自从本科学习数学建模就开始接触该方法 但是一直没有系统地整理过 借这个机会总结
  • Python操作之MySQL

    目录 安装PyMySQL PyMySQL操作mysql步骤 创建表格 连接Mysql 游标 事务特性 事务提交 查数据库 增删数据库 封装mysql类 错误处理 总结 安装PyMySQL 在使用Python中我们都要安装相关的库 mysql