一、连接MySQL
- 第1步:导入模块
import pymysql
导入模块前要先安装模块:pip install pymysql
- 第2步:连接数据库
import pymysql
con = pymysql.connect(host='localhost',port=3306,user='root',password='hzl2020',database='mydb2',charset='utf8')
简写为:
con = pymysql.connect('localhost','root','hzl2020','mydb2')
参数解释:
con:只是一个连接标识,可自定义;
host:标识主机或主机ip地址;
port:mysql端口号,默认为3306,可不填写;
user:用户名,和mysql一致;
password,mysql密码;
database:数据库名,要进入的数据库;
charset:编码格式。
- 第3步:使用cursor()方法创建游标,用来执行SQL语句
语法:游标名称=数据库连接标识.cursor()
cur = con.cursor()
cur:游标名称,可自定义。
- 第4步:用execute()方法执行SQL
语法:游标名. execute()
sql = 'select * from emp'
cur.execute(sql)
sql语句为字符串格式,每句结尾不能使用分号“;”
- 第5步:获取查询结果
语法:游标名. fetchall()
查询所有结果:
res = cursor.fetchall()
print(res)
获取查询结果的函数方法:
fetchall():获取所有结果
fetchone():获取单条结果,每次获取下一条数据
fetchmany(n):一次获取指定数量数据,返回一个元组
- 第6步:关闭连接
先关闭游标,再关MySQL!
# 先关游标
cursor.close()
# 再关MySQL
con.close()
二、增删改操作
增删改命令差不多,只要将sql命令更换为对应操作的命令即可!
import pymysql
方式一:
db = pymysql.connect('localhost','root','hzl2020','mydb2')
cur = db.cursor()
# 插入数据
sql = 'insert into person(name, age) values("aa", 20)'
try:
cursor.execute(sql)
# 提交事务
db.commit()
except Exception as e:
print(e)
# 回滚
db.rollback()
cur.close()
db.close()
方式二:使用with…as,会自动关闭游标。
db = pymysql.connect('localhost','root','hzl2020','mydb2')
with db.cursor() as cursor:
# 一次操作一条
sql:'insert into person(name, age) values("aa", 20)'
cursor.execute(sql)
db.commit()
# 一次插入多条
for i in range(11,21):
stuid = str(2000 + i)
stuname = 'luhan' + str(i)
cursor.execute(f'insert into student values("{stuid}","{stuname}")')
db.commit()
db.close()
三、查询操作
Python查询Mysql使用 fetchone() 方法获取单条数据(每次获取下一条数据), 使用fetchall() 方法获取多条数据;使用fetchmany(n)获取指定数量的数据(每次获取下一多条数据)。
import pymysql
from pymysql.cursors import DictCursor # 查询结果为字典
db = pymysql.connect('localhost','root','hzl2020','mydb2')
with db.cursor(cursor=DictCursor) as cursor:
cursor.execute('select * from student')
# 获取查询结果
res = cursor.fetchall() # 获取全部数据
res = cursor.fetchone() # 一次获取下一条数据
res = cursor.fetchone() # 一次获取下一条数据
res = cursor.fetchmany(3) # 一次获取指定数量数据,(('1001', 'zhangsan'), ('1002', 'xiaoming'), ('1003', 'jack'))
print(res)
db.close()
四、编写SQL模块
import pymysql
from pymysql.cursors import DictCursor
class SQL:
# 初始化,连接MySQL
def __init__(self, host='localhost', user='root', password='', database='', port=3306):
self.db = pymysql.connect(
host=host, port=port,
user=user, password=password,
database=database, autocommit=True
)
# 关闭MySQL连接
def close(self):
self.db.close()
# 查询: 查一条数据
def get_one(self, sql):
try:
with self.db.cursor(cursor=DictCursor) as cur:
cur.execute(sql)
return cur.fetchone()
except Exception as e:
print("查询失败:", e)
# 查询: 查多条数据
def get_all(self, sql):
try:
with self.db.cursor(cursor=DictCursor) as cur:
cur.execute(sql)
return cur.fetchall()
except Exception as e:
print("查询失败:", e)
# 增: 插入数据
def insert(self, sql):
return self.__edit(sql)
# 删: 删除数据
def delete(self, sql):
return self.__edit(sql)
# 改: 修改数据
def update(self, sql):
return self.__edit(sql)
# 封装的修改方法:增删改操作
def __edit(self, sql):
count = 0
try:
with self.db.cursor() as cur:
count = cur.execute(sql)
except Exception as e:
print("操作失败:", e)
self.db.rollback()
return count
说明:如果不希望每次SQL操作之后手动提交或回滚事务,可以像上面的代码那样,在创建连接的时候多加一个名为autocommit的参数并将它的值设置为True,表示每次执行SQL之后自动提交。如果程序中不需要使用事务环境也不希望手动的提交或回滚就可以这么做。