Python必学模块之pymysql (操作数据库)


在这里插入图片描述

一、MySQL数据库介绍

Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

1.1 MySQL特点和优势

MySQL开放源代码且无版权制约,自主性及使用成本低。

MySQL性能卓越、服务稳定,很少出现异常宕机。

MySQL支持多种操作系统,提供多种API接口,支持多种开发语言。这些开发语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。

MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。

MySQL体积小,安装方便,易于维护。

MySQL是可以定制的,采用了GPL协议,你可以修改源码来开发自己的MySQL系统。

1.2 RDBMS 特点

数据库(DATABASE)是按照数据结构来组织、存储和管理数据的仓储;
关系型数据库管理系统(RDBMS)来存储和管理的大数据量,所谓的关系型数据库是建立在关系模型

  • 数据以表的形式出现
  • 每行为各种记录名称
  • 每列为记录名称所对应的数据域
  • 许多的行和列组成一张表单
  • 若干的表单组成database

自己的理解:

数据库服务器:装有MySQL软件的计算机
数据库管理软件:MySQL
数据库/库:文件夹
表:文件
记录:一个事物的一系列典型的特征:金鞍少年,male,18
数据 :事务的特征,如 name=“金鞍少年”

1.3 RDBMS 术语

掌握MySQL 数据库必须了解一些RDBMS 相关的术语:

  • 数据库: 数据库是一些关联表的集合
  • 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
  • 列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
  • :一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
  • 冗余: 存储两倍数据,冗余可以使系统速度更快。(表的规范化程度越高,表与表之间的关系就越多;查询时可能经常需要在多个表之间进行连接查询;而进行连接操作会降低查询速度。
    • 学生的信息存储在student表中,学校信息存储在 school 表中。通过student表中的dept_id字段与school 表建立关联关系。如果要查询一个学生所在系的名称,必须从student表中查找学生所在院系的编号(dept_id),然后根据这个编号去school 查找系的名称。如果经常需要进行这个操作时,连接查询会浪费很多的时间。因此可以在student表中增加一个冗余字段dept_name,该字段用来存储学生所在院系的名称。这样就不用每次都进行连接操作了。
  • 主键: 主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据(主键是用来标识数据的,假如有多个相同的数据,那么就需要用主键来区分数据;好比同名同姓,可以使用×××号来区分,这个主键是唯一的,在数据库中不会重复。)。
  • 外键: 外键用于关联两个表(当前表中的这个键连接了其他表的别的键,当前表的这个键就叫做外键)。
  • 复合键: 复合键(组合键)将多个列作为一个索引键,一般用于复合索引(比如将多列的数据字段,变成一个索引)。
  • 索引: 使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录(比如在5万条数据中查找一个值,不需要遍历所有数据来查找,可以类似书籍目录的方式,直接定位到数据)(查找到数据不是一下就找到,而是通过一种算法来查找,但查找的次数比较少)。
  • 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

二、MySQL的安装方法

2.1 Window上安装MySQL

安装步骤

#1、下载:MySQL Community Server 5.7.29
http://dev.mysql.com/downloads/mysql/
# 最新版本为8.0.19 但是一般公司为了数据的稳定性和安全性都倾向于使用稳定可靠的版本,所以我是用的是5.7.29版本

    
#2、解压
如果想要让MySQL安装在指定目录,那么就将解压后的文件夹移动到指定目录,如:C:\mysql-5.7.16-winx64

#3、添加环境变量
【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【将MySQL的bin目录路径追加到变值值中,用 ; 分割】
 
#4、初始化
mysqld --initialize-insecure

#5、启动MySQL服务
mysqld # 启动MySQL服务

#6、启动MySQL客户端并连接MySQL服务
mysql -u root -p # 连接MySQL服务器

将MySQL服务设置为windows服务

在执行【mysqd】启动MySQL服务器时,当前终端会被hang住,那么做一下设置即可解决此问题:

注意:--install前,必须用mysql启动命令的绝对路径
# 制作MySQL的Windows服务,在终端执行此命令:
"c:\mysql-5.7.16-winx64\bin\mysqld" --install
 
# 移除MySQL的Windows服务,在终端执行此命令:
"c:\mysql-5.7.16-winx64\bin\mysqld" --remove

注册成服务之后,以后再启动和关闭MySQL服务时,仅需执行如下命令:
# 启动MySQL服务
net start mysql
 
# 关闭MySQL服务
net stop mysql

如果出现:Install/Remove of the Service Denied! ,说明权限不够

找到 C:\Windows\System32目录下的cmd.exe,右键管理员方式运行,重新上述操作即可。

2.2 Linux上安装MySQL

二进制rpm包安装

yum -y install mysql-server mysql

源码安装

1.解压tar包
cd /software
tar -xzvf mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.6.21-linux-glibc2.5-x86_64 mysql-5.6.21

2.添加用户与组
groupadd mysql
useradd -r -g mysql mysql
chown -R mysql:mysql mysql-5.6.21

3.安装数据库
su mysql
cd mysql-5.6.21/scripts
./mysql_install_db --user=mysql --basedir=/software/mysql-5.6.21 --datadir=/software/mysql-5.6.21/data

4.配置文件
cd /software/mysql-5.6.21/support-files
cp my-default.cnf /etc/my.cnf
cp mysql.server /etc/init.d/mysql
vim /etc/init.d/mysql   #若mysql的安装目录是/usr/local/mysql,则可省略此步
修改文件中的两个变更值
basedir=/software/mysql-5.6.21
datadir=/software/mysql-5.6.21/data

5.配置环境变量
vim /etc/profile
export MYSQL_HOME="/software/mysql-5.6.21"
export PATH="$PATH:$MYSQL_HOME/bin"
source /etc/profile

6.添加自启动服务
chkconfig --add mysql
chkconfig mysql on

7.启动mysql
service mysql start

8.登录mysql及改密码与配置远程访问
mysqladmin -u root password 'your_password'     #修改root用户密码
mysql -u root -p     #登录mysql,需要输入密码
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION;     #允许root用户远程访问
mysql>FLUSH PRIVILEGES;     #刷新权限

源码安装mariadb

1. 解压
tar zxvf  mariadb-5.5.31-linux-x86_64.tar.gz   
mv mariadb-5.5.31-linux-x86_64 /usr/local/mysql //必需这样,很多脚本或可执行程序都会直接访问这个目录

2. 权限
groupadd mysql             //增加 mysql 属组 
useradd -g mysql mysql     //增加 mysql 用户 并归于mysql 属组 
chown mysql:mysql -Rf  /usr/local/mysql    // 设置 mysql 目录的用户及用户组归属。 
chmod +x -Rf /usr/local/mysql    //赐予可执行权限 

3. 拷贝配置文件
cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf     //复制默认mysql配置 文件到/etc目录 

4. 初始化
/usr/local/mysql/scripts/mysql_install_db --user=mysql          //初始化数据库 
cp  /usr/local/mysql/support-files/mysql.server    /etc/init.d/mysql    //复制mysql服务程序 到系统目录 
chkconfig  mysql on     //添加mysql 至系统服务并设置为开机启动 
service  mysql  start  //启动mysql

5. 环境变量配置
vim /etc/profile   //编辑profile,将mysql的可执行路径加入系统PATH
export PATH=/usr/local/mysql/bin:$PATH 
source /etc/profile  //使PATH生效。

6. 账号密码
mysqladmin -u root password 'yourpassword' //设定root账号及密码
mysql -u root -p  //使用root用户登录mysql
use mysql  //切换至mysql数据库。
select user,host,password from user; //查看系统权限
drop user ''@'localhost'; //删除不安全的账户
drop user root@'::1';
drop user root@127.0.0.1;
select user,host,password from user; //再次查看系统权限,确保不安全的账户均被删除。
flush privileges;  //刷新权限

7. 一些必要的初始配置
1)修改字符集为UTF8
vi /etc/my.cnf
在[client]下面添加 default-character-set = utf8
在[mysqld]下面添加 character_set_server = utf8
2)增加错误日志
vi /etc/my.cnf
在[mysqld]下面添加:
log-error = /usr/local/mysql/log/error.log
general-log-file = /usr/local/mysql/log/mysql.log
3) 设置为不区分大小写,linux下默认会区分大小写。
vi /etc/my.cnf
在[mysqld]下面添加:
lower_case_table_name=1

修改完重启:#service  mysql  restartmysql

2.3 MySQL5.7安装包

由于MySQL官网下载速度太慢了 ,特意将下载好的包提供给大家

windows版本:mysql-5.7.16.7z

三、MySQL简单实用方法

由于博主对linux还处于 草色烟光残照里,无言谁会凭阑意。 的地步,关于mysql的一些操作以windows为主。

参考学习视频: https://www.bilibili.com/video/BV1nE411176d?p=161

3.1 启动服务

# win+R > cmd > 进入命令行

# 第一步 首次安装一定记得初始化
mysqld --initialize-insecure 

# 启动MySQL客户端并连接MySQL服务
mysql -u root -p # 连接MySQL服务器

3.2 登陆设置密码

# 初始状态下,管理员root,密码为空,默认只允许从本机登录localhost
# 设置密码
C:\Users\Administrator> mysqladmin -uroot -p password "123"        # 设置初始密码 由于原密码为空,因此-p可以不用

# 修改密码
C:\Users\Administrator> mysqladmin -uroot -p"123" password "456"      # 修改mysql密码,因为已经有密码了,所以必须输入原密码才能设置新密码

命令格式:
C:\Users\Administrator> mysql -uroot -p          # 无密码登录本机
C:\Users\Administrator> mysql                    # 以root用户登录本机,密码为空
C:\Users\Administrator> mysql -uroot -p123  # 有密码登录本机
    

3.3 命令行相关命令

# 连接到本机上的MYSQL
mysql -u root -p  # 回车后输入密码

# 连接到远程主机上的MYSQL 地址为110.110.110.110。
mysql -h110.110.110.110 -u root -p 123

#退出mysql命令
exit # 回车

# 查看当前登录的用户
select user();

# 设置密码
mysqladmin -uroot -p password "123"

# 增加新用户
# 格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码”
grant select,insert,update,delete on *.* to user1@localhost Identified by "password1";

# 新建数据库
# 建立一个名为testdb的数据库
create database testdb;

# 显示所有数据库
show databases;

# 删除数据库
drop database 数据库名;

# 链接数据库
# use 数据库名
use testdb;

#当前选择数据库
select database();

# 显示库中的数据表
use mysql;
show tables;

# 查询时间:
select now();
  
# 查询数据库版本:
select version();

# 导出整个数据库
# 导出文件默认是存在mysql\bin目录下
# mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u user_name -p123456 database_name > outfile_name.sql

# 导出一个表
# mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u user_name -p database_name table_name > outfile_name.sql

3.4 破解MySQL密码

windows平台下,5.7版本mysql,破解密码的两种方式:

方式一:

#1 关闭mysql
#2 在cmd中执行:mysqld --skip-grant-tables
#3 在cmd中执行:mysql
#4 执行如下sql:
update mysql.user set authentication_string=password('') where user = 'root';
flush privileges;

#5 tskill mysqld #或taskkill -f /PID 7832
#6 重新启动mysql

方式二:

#1. 关闭mysql,可以用tskill mysqld将其杀死
#2. 在解压目录下,新建mysql配置文件my.ini
#3. my.ini内容,指定
[mysqld]
skip-grant-tables

#4.启动mysqld
#5.在cmd里直接输入mysql登录,然后操作
update mysql.user set authentication_string=password('') where user='root and host='localhost';

flush privileges;

#6.注释my.ini中的skip-grant-tables,然后启动myqsld,然后就可以以新密码登录了

3.5 为MySQL设置配置文件

#在mysql的解压目录下,新建my.ini,然后配置
#1. 在执行mysqld命令时,下列配置会生效,即mysql服务启动时生效
[mysqld]
;skip-grant-tables
port=3306
character_set_server=utf8
default-storage-engine=innodb
innodb_file_per_table=1


#解压的目录
basedir=E:\mysql-5.7.19-winx64
#data目录
datadir=E:\my_data #在mysqld --initialize时,就会将初始数据存入此处指定的目录,在初始化之后,启动mysql时,就会去这个目录里找数据


#2. 针对客户端命令的全局配置,当mysql客户端命令执行时,下列配置生效
[client]
port=3306
default-character-set=utf8
user=root
password=123

#3. 只针对mysql这个客户端的配置,2中的是全局配置,而此处的则是只针对mysql这个命令的局部配置
[mysql]
;port=3306
;default-character-set=utf8
user=egon
password=4573


#!!!如果没有[mysql],则用户在执行mysql命令时的配置以[client]为准

my.ini

四、简单SQL语句

SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型:
1、DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
2、DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
3、DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE

#1. 操作数据库
        增:create database db1 charset utf8;
        查:show databases;
        改:alter database db1 charset latin1;
        删除: drop database db1;


#2. 操作数据库下的数据表
    先切换到数据库下:use db1
        增:create table t1(id int,name char);
        查:show tables
        改:alter table t1 modify name char(3);
              alter table t1 change name name1 char(2);
        删:drop table t1;
    

#3. 操作数据表中的内容/记录
        增:insert into t1 values(1,'egon1'),(2,'egon2'),(3,'egon3');
        查:select * from t1;
        改:update t1 set name='sb' where id=2;
        删:delete from t1 where id=1;

        清空表:
            delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
            truncate table t1;数据量大,删除速度比上一条快,且直接从零开始,

            auto_increment 表示:自增
            primary key 表示:约束(不能重复且不能为空);加速查找

更多mysql 参考:《深入浅出mysql》学习笔记

五、pymysql模块

5.1 安装模块

pip3 install pymysql

5.2 pymysql基本操作

使用PyMySQL模块固定不变的执行顺序

1. 建立连接
2. 拿到游标
3. 执行SQL语句
4. 事务处理(提交修改)
5. 关闭(游标、连接)

5.3 数据库连接

语法:

 conn= pymysql.connect(host='localhost',
                              user='user',
                              password='passwd',
                              db='db',
                              charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

参数解读:

参数 解释
host 数据库服务器地址,默认 localhost,也可以用127.0.0.1本地地址来表示
user 用户名,默认为当前程序运行用户
password 登录密码,默认为空字符串
database 默认操作的数据库
port 数据库端口,默认为 3306
bind_address 当客户端有多个网络接口时,指定连接到主机的接口。参数可以是主机名或IP地址
unix_socket unix 套接字地址,区别于 host 连接
read_timeout 读取数据超时时间,单位秒,默认无限制
write_timeout 写入数据超时时间,单位秒,默认无限制
charset 数据库编码
sql_mode 指定默认的 SQL_MODE
read_default_file 指定my.cnf文件从[client]部分读取这些参数。
conv 转换字典以代替默认字典使用,这用于提供类型的自定义编组和解组。
use_unicode 是否默认为unicode字符串。在python3中这个选项默认为true。
client_flag 要发送到MySQL的自定义标记,在constants.CLIENT中找到潜在的价值。
cursorclass 设置默认的游标类型,默认为cursor
init_command 当连接建立完成之后执行的初始化 SQL 语句
autocommit 是否自动提交,默认不自动提交,参数值为 None 表示以服务器为准
defer_connect 是否惰性连接,默认为立即连接
max_allowed_packet 发送给服务器的最大数据量,默认为 16MB
db 参数 database 的别名
passwd 参数 password 的别名
binary_prefix 在字节和字节数组上添加_binary前缀(默认值:False)
connect_timeout 连接超时时间,默认 10,最小 1,最大 31536000
auth_plugin_map A dict of plugin names to a class that processes that plugin. The class will take the Connection object as the argument to the constructor. The class needs an authenticate method taking an authentication packet as an argument. For the dialog plugin, a prompt(echo, prompt) method can be used (if no authenticate method) for returning a string from the user. (experimental)
server_public_key SHA256 authenticaiton plugin公钥值。(默认值:无)

5.4 游标

连接完数据库,接着就该获取游标,之后才能进行执行、提交等操作。

什么是游标:

游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。

语法:

cursor = conn.cursor()

查询时,默认返回的数据类型为元组,可以修改返回类型

几种常用游标类型:

类型 作用
Cursor 默认,元组类型
DictCursor 字典类型
SSCursor 无缓冲元组类型
SSDictCursor 无缓冲字典类型

提示: 无缓冲游标类型,适用于数据量很大,一次性返回太慢,或者服务端带宽较小 创建连接时,

方法一:通过cursorclass 参数指定类型:

conn = pymysql.connect(host='localhost',
                             user='root',
                             password='root',
                             db='db',
                             charset='utf8',
                             cursorclass=pymysql.cursors.DictCursor)

方法二: 创建游标时指定类型

cursor = connection.cursor(cursor=pymysql.cursors.DictCursor)

游标的移动:

所有的数据查询操作均基于游标,我们可以通过cursor.scroll(num, mode)控制游标的位置。

cursor.scroll(1, mode='relative') # 相对当前位置移动
cursor.scroll(2, mode='absolute') # 相对绝对位置移动

5.5 执行SQL语句

参考上文章节4,简单SQL语句,将写好的SQL语句通过 cursor.execute(sql, args) 进行执行。

这里的参数 args 可以是,(tuple,list,dict), execute 还能返回受影响的行数

# sql执行语句
# INSERT INTO 语句用于向表格中插入新的行。
# INSERT INTO 表名称 VALUES (值1, 值2,....)
sql = " insert into student(id,name,course ) values (null,%s,%s) " # 往student表中的id,name,coerse字段中添加数据,其中id是自增的,可以设置为null

cursor.execute(sql, ('张三', '刑法'))  # 执行sql语句
db.commit()  # 提交

批量执行cursor.executemany(sql, args)

5.6 返回执行结果

使用pymysql查询数据,可以使用fatch*方法

方法 作用
fetchone() 这个方法每次只获取一条数据
fetchall() 获取所有数据
fetchmany(size) 可以获取指定条数数据

5.7 事务处理

事务开始:

conn.begin() 

提交修改:

sql语句执行完之后,需要提交修改才能在数据库中修改

conn.commit() 

事务回滚:

conn.rollback()

5.8 关闭(游标、连接)

一般用于最后结束对数据库的操作,可在 finally 中写

关闭数据库连接:

conn.close()

关闭游标:

cursor.close()

六、增删改查实例

在这里插入图片描述

操作的数据库为csdn_python_study,操作的表为student,其中id为自增主键。

6.1 增实例

import pymysql


# 简易写法

# 使用pymysql.connect链接数据库
db = pymysql.connect(host='127.0.0.1', user='root', password="123", database='csdn_python_study', port=3306)

# 获取db数据库上的cursor对象
cursor = db.cursor()

# sql执行语句
# INSERT INTO 语句用于向表格中插入新的行。
# INSERT INTO 表名称 VALUES (值1, 值2,....)
sql = " insert into student(id,name,course ) values (null,%s,%s) "

cursor.execute(sql, ('张三', '刑法'))  # 执行sql语句
db.commit()  # 提交

db.close()  # 关闭数据库,回收系统资源



def add_content(host,name,passwd,db,port):
    conn = pymysql.connect(host=host, user=name, password=passwd, database=db, port=port)
    cursor = conn.cursor()

    try:
        add_sql = " insert into student(id,name,course ) values (null,%s,%s) "
        cursor.execute(add_sql,("后羿","王者荣耀"))
        conn.commit()
        print('执行成功!')
    except Exception as e:
        print(u'查询错误...', e)
        conn.rollback()
    finally:
        cursor.close()
        conn.close()


if __name__ == '__main__':
    add_content('127.0.0.1', 'root', "123", 'csdn_python_study', 3306)

6.2 删除内容实例

import pymysql

# 连接数据库
db = pymysql.connect(host='127.0.0.1', user='root', password="123", database='csdn_python_study', port=3306)

# 获取游标
cursor = db.cursor()

sql = "delete from student where id = 2"  # 删除student表中id为2的行
cursor.execute(sql)

db.commit()  # 事件提交

db.close()   # 管理连接,回收系统资源

6.3 修改实例

import pymysql

# 连接数据库
db = pymysql.connect(host='127.0.0.1', user='root', password="123", database='csdn_python_study', port=3306)

# 获取游标
cursor = db.cursor()

sql = "update student set name='刘亦菲' where id= 3"  # 找到id为3的行,将name内容改为刘亦菲
cursor.execute(sql)
db.commit()

db.close()

6.4 查询实例

import pymysql

db = pymysql.connect(host="127.0.0.1", user="root", password="123",
                 database="csdn_python_study", port=3306)

cursor = db.cursor()

sql = "select name,course from student "
cursor.execute(sql)

# result1 = cursor.fetchone()  # 获取第一条
#
# result2 = cursor.fetchall()  # 获取所有

result3 = cursor.fetchmany(2)  # 获取前2条

print(result3)

cursor.close()
db.close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章