Python操作之MySQL

目录

安装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.关闭数据库连接

流程图如下:

Python操作之MySQL_第1张图片

实例代码如下:

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_第2张图片

总结

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

你可能感兴趣的:(python,游戏,mysql,数据库,database,python,数据分析)