利用python连接数据库(pymysql模块使用)

前言

文章目录

    • 前言
    • pymysql
        • 1.创建connection对象
        • 2.connection对象支持的方法:
        • 3.curser对象支持的方法:
        • 4.增删改查和事务处理示例:

pymysql包 包含了一个基于 PEP-249的纯python的MySQLclient,大多数公共API与mysqlclient和MyAQLdb兼容。

要求

  • Python
    • Cpython:2.7版本或者大于3.5版本
    • PyPy:最新版本
  • MySQL Server:
    • MySQL >=5.5
    • Mariadb >=5.5

安装:
pymysql是第三方模块,可以使用pip、conda等命令安装

pip install pymysql
conda install pymysql

使用pycharm的话除了上面两种安装方式,还可以使用project python 安装第三方模块:

File >> setting >> Project:python >> project interpreter >> 右边 + ,查找pymysql然后install即可

pymysql

先记一个大坑: 由于用的是虚拟机vmvare,忘记关闭firewalld服务,导致一直连接不上去,后面关掉就顺利连接上了。

1.navicat的连接数据库服务,不需要连接ssh
2.封装的TCP协议。服务端直接连接就好了。
利用python连接数据库(pymysql模块使用)_第1张图片
利用python连接数据库(pymysql模块使用)_第2张图片

创建一个表

CREATE TABLE `reg` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `age` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4;

通过navicat打开,它的样子是这样的:


一般流程:
1.创建连接返回值为Connection的实例对象connection连接
2.根据已有的连接对象connection创建curser游标对象
3.执行curser操作的方法
4.提交事务,释放资源

1.创建connection对象

pymysql.connect常用参数说明:

参数 参数类型 含义
host str MySQL服务器端地址
user str MySQL用户名
password str MySQL用户密码
database str 数据库名称
port int MySQL服务端端口号,默认3306
charset str 连接编码

更多参数请查看py源码

import pymysql
from pymysql.cursors import DictCursor

IP = "192.168.48.132"  # mysql所在的服务host
USER = "ammmao"  # mysql用户
PASSWORD = "353231"  # mysql密码
DATABASE = "test"
PORT = 3306  # mysql服务的端口,默认是3306
CHARSET = "utf8"

conn = None
try:
    conn = pymysql.connect(IP,USER,PASSWORD,DATABASE,PORT,charset=CHARSET)
finally:
    if conn:
        conn.close()  

2.connection对象支持的方法:

方法 含义
①curser(curser=None) 使用该连接创建并返回一个新的curser对象。参数curser表示游标的类型:Curser、SSCurser、DictCurser、SSDictCurser,可以通过from pymysql.cursers import导入
②commit() 提交当前事务
③rollback() 回滚当前事务
④close() 关闭当前连接对象

注意:
connection对象支持上下文管理,查看源码py文件:

class Connection(object):
    ...
    def __enter__(self):
        return self.cursor()  # 返回curser对象

    def __exit__(self, exc, value, traceback):
        if exc:
            self.rollback()
        else:
            self.commit()

3.curser对象支持的方法:

方法 含义
①execute(query, args=None) 执行一个查询,args用来进行参数化查询
②fetchone() 获取结果集的下一行
③fetchmany(size=None) 获取结果集的下几行,默认是一行
④fetchall() 获取结果集中的所有行
⑤rowcount() 返回数据条数或者影响行数
⑥rownumber() 返回当前行号。可以修改,支持负数
⑦close() 关闭游标对象

注意:
curser对象也支持上下文管理,查看源码py文件:

class Cursor(object):
    def __enter__(self):
        return self

    def __exit__(self, *exc_info):
        del exc_info
        self.close()

结合connection对象演示简单的上下文管理进行数据库操作:

import pymysql
from pymysql.cursors import DictCursor

IP = "192.168.48.132"  # mysql所在的服务host
USER = "ammmao"  # mysql用户
PASSWORD = "353231"  # mysql密码
DATABASE = "test"
PORT = 3306  # mysql服务的端口,默认是3306
CHARSET = "utf8"

conn = pymysql.connect(IP,USER,PASSWORD,DATABASE,PORT,charset=CHARSET)

with conn as curser:  # 只能返回一个最基本的curser对象
    with curser:
        sql = "select * from reg"
        curser.execute(sql)
        for record in curser.fetchall():
            print(record)

conn.close()  # connection对象还是需要自己手动close()掉

4.增删改查和事务处理示例:

import pymysql
from pymysql.cursors import DictCursor

IP = "192.168.48.132"  # mysql所在的服务host
USER = "ammmao"  # mysql用户
PASSWORD = "353231"  # mysql密码
DATABASE = "test"
PORT = 3306  # mysql服务的端口,默认是3306
CHARSET = "utf8"

# 连接数据库
connect = pymysql.connect(IP, USER, PASSWORD, DATABASE, PORT, charset=CHARSET)

# 获取游标
curser = connect.cursor(DictCursor)

# 插入数据
sql1 = "INSERT INTO reg (id, name, age) VALUE(%s, %s, %s)"
data1 = (1, "老王", 38)
curser.execute(sql1, data1)
connect.commit()
print("成功插入{}条数据".format(curser.rowcount))

# 修改数据
sql2 = "UPDATE reg SET name=%s WHERE id=%s"
data2 = ("老牛",1)
curser.execute(sql2, data2)
connect.commit()
print("成功修改{}条数据".format(curser.rowcount))

# 查询数据
sql3 = "SELECT * FROM reg WHERE id=%s"
data3 = (1,)
curser.execute(sql3,data3)
connect.commit()
print("成功查询{}条数据".format(curser.rowcount))

# 删除数据
sql4 = "DELETE FROM reg WHERE id=%s"
data4 = (1,)
curser.execute(sql4, data4)
connect.commit()
print("成功删除{}条数据".format(curser.rowcount))

# 事务处理
sql5 = "INSERT INTO reg (id, name, age) VALUE (100,'小李',18)"
sql6 = "UPDATE reg SET name='小牛' WHERE id=100"
sql7 = "UPDATE reg SET age=10 WHERE id=100"

try:
    curser.execute(sql5)
    curser.execute(sql6)
    curser.execute(sql7)
except Exception as e:
    connect.rollback()
    print("事务处理失败", e)
else:
    connect.commit()
    print("事务处理成功")

# 关闭连接
curser.close()
connect.close()

更多请参考PyMySQL

你可能感兴趣的:(Python核心部分,数据库相关,python3,pymysql,连接数据库)