Python3 Mysql API

1. 安装引入

2. 对象简介

3. 代码封装

 

 

1. 安装引入

1)安装:

pip install PyMySQL

2)Pycharm 中引入 pymysql:

1dbec4922a0bbd4609630ff98967632e.png

3)在文件中引入模块:

import pymysql

如果系统不支持 pip 命令,可以使用 git 命令下载安装包安装(也可以手动下载):

$ git clone https://github.com/PyMySQL/PyMySQL
$ cd PyMySQL/
$ python3 setup.py install

 

2. 对象简介

Connection 对象

作用:用于建立与数据库的连接。通过调用 connect() 方法来创建对象:

conn = connect(host, port, db, user, password, charset)
  • host:连接的 mysql 主机,本机则为 'localhost'。
  • port:连接的 mysql 主机的端口,默认是 3306。
  • db:数据库的名称。
  • user:连接的用户名。
  • password:连接的密码。
  • charset:通信采用的编码方式,默认是 'gb2312',要求与数据库创建时指定的编码一致,否则中文会乱码。

对象的方法

  • close():关闭连接。
  • commit():提交事务,即需要提交才会生效。
  • rollback():回滚事务,即放弃之前的操作。
  • cursor():返回 Cursor 对象,用于执行 sql 语句并获得结果。

Cursor 对象

作用:执行 sql 语句。通过调用 Connection 对象的 cursor() 方法来创建对象:

cursor1 = conn.cursor()

对象的方法

  • close():关闭。
  • execute(operation [, parameters]):执行语句,返回受影响的行数。
  • fetchone():执行查询语句时,获取查询结果集的第一行数据,返回一个元组。
  • fetchall():执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回。
  • scroll(value[, mode]):将行指针移动到某个位置。
    • mode:表示移动的方式。
    • mode默认值为 relative,表示基于当前行移动到 value,value 为正则向下移动,value 为负则向上移动。
    • mode的值为 absolute,表示基于第一条数据的位置,第一条数据的位置为 0。

对象的属性

  • rowcount:只读属性,表示最近一次 execute() 执行后受影响的行数。
  • connection:获得当前连接对象。

代码范例

 1 import pymysql
 2 
 3 conn = pymysql.connect(host="localhost", port=3307, db="电商销售", user="root", passwd="admin123", charset='utf8')
 4 cursor = conn.cursor()
 5 cursor.execute("select %s from %s;" % ("*", "产品信息"))
 6 first_row = cursor.fetchone()  # 取第一行数据
 7 print(first_row)
 8 second_row = cursor.fetchone()  # 取下一行数据(第二行)
 9 print(second_row)
10 all_row = cursor.fetchall()  # 取剩下的所有行数据(第三行及之后)
11 print(all_row)

执行结果:

7d9b94e7862d5dde7f8024fe7d48ee23.png

 

3. 代码封装

观察发现,除了 SQL 语句及参数不同,其它语句都是一样的,故创建 MysqlTool 封装类。

详细版

 1 import pymysql
 2 
 3 
 4 class MysqlTool:
 5 
 6     def __init__(self, host, port, db, user, passwd, charset="utf8"):
 7         self.host = host
 8         self.port = port
 9         self.db = db
10         self.user = user
11         self.passwd = passwd
12         self.charset = charset
13 
14     def connect(self):
15         '''创建数据库连接与执行对象'''
16         try:
17             self.conn = pymysql.connect(host=self.host, port=self.port, db=self.db, user=self.user, passwd=self.passwd, charset=self.charset)
18             self.cursor = self.conn.cursor()
19         except Exception as e:
20             print(e)
21 
22     def close(self):
23         '''关闭数据库连接与执行对象'''
24         try:
25             self.cursor.close()
26             self.conn.close()
27         except Exception as e:
28             print(e)
29 
30     def query_one(self, sql, params=()):
31         '''获取一行数据'''
32         try:
33             self.cursor.execute(sql, params)
34             result = self.cursor.fetchone()
35         except Exception as e:
36             print(e)
37         else:
38             return result
39 
40     def query_all(self, sql, params=()):
41         '''获取所有行数据'''
42         try:
43             self.cursor.execute(sql, params)
44             result = self.cursor.fetchall()
45         except Exception as e:
46             print(e)
47         else:
48             return result
49 
50     def __edit(self, sql, params=()):
51         '''增删改查的私有方法'''
52         try:
53             execute_count = self.cursor.execute(sql, params)
54             self.conn.commit()
55         except Exception as e:
56             print(e)
57             self.conn.rollback()
58         else:
59             return execute_count
60 
61     def insert(self, sql, params=()):
62         '''插入数据'''
63         return self.__edit(sql, params)
64 
65     def update(self, sql, params=()):
66         '''更新数据'''
67         return self.__edit(sql, params)
68 
69     def delete(self, sql, params=()):
70         '''删除数据'''
71         return self.__edit(sql, params)

测试代码

1)创建表

create table userinfos(
id int primary key auto_increment,
uname varchar(20),
upwd char(40),
isdelete bit default 0
);

2)测试封装代码

 1 from hashlib import sha1
 2 
 3 
 4 # 创建数据库连接与执行的对象
 5 tool = MysqlTool("localhost", 3307, "电商销售", "root", "admin123")
 6 tool.connet()
 7 
 8 # 插入新用户数据
 9 # 使用sha1加密,返回40位字符的密码串
10 s = sha1()
11 s.update("123".encode("utf8"))
12 new_pwd = s.hexdigest()
13 insert_sql = "insert into userinfos values(0, 'root', %s, 0)"
14 insert_params = (new_pwd)
15 row_count = tool.insert(insert_sql, insert_params)
16 print(row_count)  # 1
17 
18 # 登录查询
19 uname = input("请输入用户名:")
20 pwd = input("请输入密码:")
21 s.update(pwd.encode("utf8"))
22 new_pwd = s.hexdigest()
23 query_sql = "select * from userinfos where uname = %s"
24 query_params = uname
25 userinfo = tool.get_one(query_sql, query_params)
26 if not userinfo:
27     print("用户名错误")
28 else:
29     if userinfo[2] == new_pwd:
30         print("登录成功")
31     else:
32         print("密码错误")
33 
34 # 关闭连接
35  tool.close()

简要版 

import pymysql
import app  # 全局变量


class DButils:

    # 初始化连接
    def __init__(self):
        self.conn = pymysql.connect(app.DB_HOST, app.DB_USERNAME, app.DB_PWD, app.DATABASE, autocommit=True)
        self.cursor = self.conn.cursor()
        
    # 关闭连接
    def close_conn(self, cursor=None, conn=None):
        if cursor:
            self.cursor.close()
        if conn:
            self.conn.close()
        
    # 执行SQL并关闭连接
    def execute_sql(self, sql):
        try:
            self.cursor.execute(sql)
        except Exception as e:
            self.conn.rollback()
        finally:
            self.close_conn()

 

posted @ 2021-03-17 22:08  Juno3550  阅读(206)  评论(0)    收藏  举报