Python3 Mysql API
1. 安装引入
2. 对象简介
3. 代码封装
1. 安装引入
1)安装:
pip install PyMySQL
2)Pycharm 中引入 pymysql:
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)
执行结果:
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()