Python3 使用 PyMySQL 连接数据库
一. 安装PyMySQL
1.什么是PyMySQL
PyMySQL是在python3.x版本中用于连接MySQL服务器的一个库;
PySQL遵循Python数据库API v2.0规范,并包含了pure-Python MySQL客户端库。
2.安装PyMySQL
PyMySQL下载地址:GitHub - PyMySQL/PyMySQL: MySQL client library for Python
可以使用命令来安装PyMySQL:
pip install PyMySQL
若系统不支持pip命令,可以使用以下方式来安装:
- 使用git命令下载安装包安装:
git clone https://github.com/PyMySQL/PyMySQL
cd PyMySQL/
python3 setup.py install
- 若需要指定版本号,可以使用curl命令
# pymysql-X.X 为PyMySQL版本号
curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz
cd PyMySQL*
python3 setup.py install
二. 数据库操作
1. 建立数据库连接
# host=数据库地址, port=端口号, user=用户名,password=密码,db=数据库, charset=编码
conn=pymysql.connect(host='127.0.0.1',
port=3306,
user='root',
password='root',
db='testpython',
charset='utf8',
autocommit=True ) #自动提交
2. 获取游标对象
cur=conn.cursor()
3. 使用游标进行读写操作
# 语法: cur.execute(sql)
cur.execute("select * from user")
4. 获取查询结果
# 获取一条数据,同时获取的数据会从结果集中删除
cur.fetchone()
# 获取多条数据
cur.fetchmany(num)
# 获取所有数据
cur.fetchall()
注意:获取完数据后,数据会从数据集中删除,再次获取会获取不到,所以在获取数据后最好保存给某个变量
5. 提交更改
conn.commit()
6. 执行插入操作
insert_q = "INSERT INTO user (column1, column2) VALUES (%s, %s)"
data_insert = ("value1, value2")
cursor.execute(insert_q, data_insert)
connection.commit()
7. 更新数据
update_q = "UPDATE user set column2 = %s WHERE column1 = %s"
new_value = "new_value"
old_value = "value1"
cursor.execute(update_q, (new_value, old_value))
connection.commit()
8.删除数据
delete_q = " DELETE FROM user WHERE colum1 = %s"
value_delete = "value1"
cursor.execute(delete_q, (value_delete, ))
connection.commit()
9. 关闭游标
cur.close()
10. 关闭连接
conn.close()
11. 回滚操作
conn.rollback()
三. 综合练习
1. 创建数据库表information(并插入不少于三条信息),字段信息如下:
数据名称 | 数据类型 | 是否唯一 | 是否为空 |
pid(主键) | int | YES | NO |
users(账号) | varchar(20) | YES | NO |
cod(密码) | varchar(20) | NO | NO |
name(姓名) | varchar(20) | NO | NO |
age(年龄) | int | NO | NO |
mobile(电话号码) | varchar(50) | NO | NO |
2. 系统开始菜单如下
- 【1】用户选择菜单1—— 用户信息注册
要求:
1)添加用户信息,包括(账号、密码、姓名、年龄、手机号)
2) 账号不可重复
- 【2】根据账号密码删除用户信息
要求:
1)输入账号密码匹配,提示“删除成功”,
2) 输入账号不存在或账号密码不匹配,提示“账号不存在,查无此人”,并能重新输入
- 【3】根据账号密码修改指定用户信息
要求:
检验账号密码匹配成功,则可以修改用户信息,包括(姓名、年龄、电话号码), 提示“修改成功”,反之则提示“查无此人”
- 【4】查询用户信息
要求:查看前五条用户信息
- 【5】退出系统
代码展示:
dao层
from utils.DBUtil import DBUtil
class Test:
def add_database(self):
connection = DBUtil.get_connection(self)
cursor = connection.cursor()
sql = '''
create table if not exists information(
pid int not null primary key auto_increment,
users varchar(20) not null,
cod varchar(20) not null,
name varchar(20) not null,
age int not null,
mobile varchar(50) not null
)
'''
cursor.execute(sql)
DBUtil.close_all(self, connection, cursor)
def add(self):
connection = DBUtil.get_connection(self)
cursor = connection.cursor()
sql = 'insert into `information`(`users`,`cod`,`name`,`age`,`mobile`) values (%s,%s,%s,%s,%s)'
affect_row = cursor.executemany(sql, [('a123', '321321', '张三', 20, '110'),
('a198', '111111', '李四', 23, '119'),
('a456', '345876', '王五', 28, '120'),
('a654', '897123', '赵六', 17, '114'),
('a841', '816972', '小明', 65, '201'),
('a087', '102365', '小红', 23, '651'),
('a901', '904783', '小黄', 25, '913'),
('a798', '630595', '小青', 18, '012'),
('a307', '611335', '小紫', 23, '317')])
print(f'受影响的行数{affect_row}')
if affect_row > 0:
print('添加成功')
else:
print('添加失败')
DBUtil.close_all(self, connection, cursor)
def update(self, users, cod):
connection = DBUtil.get_connection(self)
cursor = connection.cursor()
sql = 'update information set name= %s,age=%s,mobile=%s where users =%s and cod=%s'
affect_row = cursor.execute(sql, ('小刘', 80, 100100, users, cod))
if affect_row > 0:
print('修改成功')
else:
print('查无此人')
DBUtil.close_all(self, connection, cursor)
def delete(self, users, cod):
connection = DBUtil.get_connection(self)
cursor = connection.cursor()
sql = 'delete from information where users =%s and cod=%s'
affect_row = cursor.execute(sql, (users, cod))
if affect_row > 0:
print('删除成功')
else:
print('账号不存在,查无此人')
DBUtil.close_all(self, connection, cursor)
def select(self, currPageNo):
connection = DBUtil.get_connection(self)
cursor = connection.cursor()
sql = 'select * from information limit %s,5'
cursor.execute(sql, ((currPageNo - 1) * 5))
row = cursor.fetchall()
for item in row:
print(item[0], item[1], item[2], item[3], item[4], item[5])
DBUtil.close_all(self, connection, cursor)
test
from dao.a import Test
t = Test()
t.add_database()
while True:
print('*******************************')
print('【1】注册用户信息')
print('【2】删除用户信息')
print('【3】修改用户信息')
print('【4】查询用户信息')
print('【5】退出系统')
print('*******************************')
choice = int(input('请输入你要执行的命令'))
if choice == 1:
t.add()
continue
elif choice ==2:
use = input('账号')
pas = input('密码')
t.delete(use,pas)
continue
elif choice ==3:
use1 = input('账号')
pas1 = input('密码')
t.update(use1,pas1)
continue
elif choice ==4:
page = int(input('请输入页数'))
t.select(page)
continue
else:
print('欢迎下次使用!')
break
utils
import pymysql
class DBUtil:
'''
操作数据库的工具类
'''
def get_connection(self):
'''
创建connection对象
:return: connection对象
'''
connection = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='root',
db='testpython',
charset='utf8mb4'
)
return connection
def close_all(self,connection,cursor):
'''
关闭对象
:param connection:数据库连接对象
:param cursor: 游标对象
:return: 无返回值
'''
# 5.提交更改
connection.commit()
# 6.关闭游标对象
cursor.close()
# 7.关闭连接对象
connection.close()