Python对Mysql数据库的操作,大致分为以下五个部分
- 引入pymysql模块
- 使用connect方法连接数据库
- 通过cursor方法创建一个游标对象
- 通过游标执行SQL语句
- 从游标执行结果中读取数据
1、下载pymysql包
- 使用pip install pymysql
- 在pycharm中直接下载
2、连接数据库
连接对象 = pymysql.connect(host='主机', user='用户', password='密码', database='数据库', port='端口号',charset='字符集')
'''
说明:
主机 —— 数据库服务器所在的主机,可以是域名或IP地址
用户 —— 可以登录服务器的用户名
密码 —— 可以验证用户身份
数据库 —— 要使用的数据库,连接服务器的同时设置当前数据库
port —— 要使用的MySql端口,默认通常是OK(默认:3306)
charset —— 设置来凝结到数据库党的交互字符集(必须设置,否则中文会乱码)
'''
注意:connect中的charset是’utf8’,而不是’utf-8’。还有就是,port为number而不是string格式
3、连接对象的常用方法
1)cursor()
#引入pymysql
import pymysql
#调用pymysql的connect方法连接数据库
db = pymysql.connect(host='127.0.0.1',user='root',passqord='root',database='post',port=3306,charset='utf8')
#利用cursor()方法创建出游标
link = db.cursor()
#利用游标的execute()方法执行SQL语句
sql='select * from student'
link.execute(sql)
#读取数据
data=link.fetchall()
2)close()
#关闭数据库连接
#引入模块
import pymysql
#连接数据库
db = pymysql.connect(host='localhost',user='root',password='root',database='post',port=3306,charset='utf8')
db.close()
#关闭数据库以后无法再获取到数据
'''
!!!!特此强调:
关闭数据库连接以后,无法再获取数据,但是内存中的db对象仍然存在
'''
3)select_db()
- 选择1个数据库作为当前操作的数据库
- 语法:db.select_db(‘数据库名’)
4、PyMysql操作数据库之发送SQL语句
1)execute()
- 将一条SQL语句发送到数据库服务器并返回执行结果
- 语法:游标对象.execute(‘SQL语句’,参数)
#连接数据库
#通过连接对象创建游标
link = db.cursor()
#通过游标执行查询操作
link.execute('select * from studnet')
#如果args是列表或者元组,则%s可以用作查询中的占位符。如果args是字典,则%(name)可以用作查询中的占位符
link.execute('select * from student where stu_name=%s',('关羽'))
'''
!!!!特此强调:
SQL语句内的%s占位符,不能加引号
在执行语句需要数据拼接时使用参数进行查询,可避免SQL注入
'''
2)executemany()
- 针对一个SQL语句运行多个数据
- 语法:游标对象.executemany(‘SQL语句’,[参数1,参数2…参数n])
#通过连接对象创建游标
link -= db.cursor()
#通过executemany与参数配合实现批量新增数据
link.executemany('insert into studnet values(%s,%s)',[('大乔',30),('小乔',25)])
'''
此方法可提高多行INSERT 和REPLACE的性能,否则,它等同于使用execute()循环 args
'''
5、PyMysql操作数据库之结果集处理
1)fetchone()
- 获取下一行数据(获取一行数据,数据指针自动移动到下一行)
- 语法:游标.fetchone()
#通过游标执行查询操作
link.execute('select * from student')
#通过fetchone获取下一行数据
data=link.fetchall()
#输出获取到的数据
print(data)
#通过fetchone获取下一行数据
data=link.fetchall()
#输出获取到的数据
print(data)
'''
类似于指针的东西,会一直向下指
'''
2)fetchall()
- 获取全部行的数据
- 语法:游标.fetchall
#fetchall获取所有数据
data = fetchall()
print(data)
#遍历数据:
for value in data:
print(f"姓名:{value[0]} 年龄:{value[1]}")
3)fetchmany()
- 获取指定数量的数据
- 语法:游标.fetchallmany(数量)
#通过游标执行查询操作
link.execute('select * from student')
#通过fetchone获取下一行数据
data = link.fetchmany(3)
#输出获取到的数据
print(data)
6、事务的操作流程
'''
事务:
1、begin
开启事务机制(默认开启)
语法:连接对象.begin()
2、commit
提交事务,将所有已经执行的语句,永久修改到数据库中
语法:连接对象.commit()
3、rollback
事务回滚
语法:连接对象.rollback()
'''
import pymysql
db = pymysql.connect(host='127.0.0.1',user='root',password='root',database='post',port=3306,charset='utf8')
link = db.cursor()
#开启事务
db.begin()
sql = "insert into news(title,content) values('今天发生了一件大事','狗丢了')"
r = link.execute(sql)
#提交事务
db.commit()
print(r)
'''
!!!!特此强调:
事务的数据表必须是innodb才行
'''