mysql数据库可以应用于多种编程语言,包括 PHP,Java,Go,Python
不同编程语言操作mysql,都是使用了mysql提供的API接口
如果直接操作mysql提供的API相对复杂一些,因此不同的编程语言都有不同的封装好的包或者模块进行数据库的相关操作。
在python中也有很多的包或模块进行mysql数据库的操作,比较知名的包包括pymysql,mysqldb
1.安装pymysql
打开cmd,输入命令:pip install pymysql
2.python操作mysql的基本步骤
-
连接mysql数据库
connection = pymysql.connect(host = 'localhost', user = 'root', password = '', db = 'test', charset = 'utf8', cursorclass = pymysql.cursors.DictCursor)
【连接mysql数据库时的 cursorclass=pymysql.cursors.DictCursor
可以把结果转为 字典类型,默认为元组】【注意!可以这样写,但是 ‘charset=’ 和 ‘cursorclass=’ 一定不能省略】
connection = pymysql.connect('localhost','root','','test', charset = 'utf8mb4', cursorclass = pymysql.cursors.DictCursor)
-
创建游标对象
cursors = a.cursor()
-
准备sql
sql = 'select version();'
【注意!字符串里的sql有没有分号都行,因为mysql会进行语法解析和查询优化!在第五节的笔记里有】
-
用游标对象执行sql
cursors.execute(sql) #在执行sql时,注意进行提交,不过也可以不写 connection.commit()
【commit()提交更改,以稳定存储】
【注意!db.commit()和下面的db.rollback()是在进行数据的增删改操作的时候才用到的,其他时候无所谓】
【注意!执行sql,返回的结果是执行的行数】
#例 sql = 'select version();' row = cursors.execute(sql) print(row) >>>1 #此时只执行了1行
-
用游标对象提取结果
data = cursors.fetchall()
【fetchall() 提取所有的结果。fetchone() 提取一条结果】
【注意!如果执行的是非查询类sql,则没有返回的结果(也就是返回为None),提取不到数据】
-
关闭数据库连接
connection.close()
3.pymysql的示例代码
【关于数据库的操作,用的都是连接数据库的变量对象,例如下面的a】
【关于sql语句的操作,用的都是游标对象,例如下面的b】
import pymysql
#1.连接数据库
a = pymysql.connect(host = 'localhost',
user = 'root',
password = '',
db = 'test',
charset = 'utf8',
cursorclass = pymysql.cursors.DictCursor)
#2.创建游标对象
b = a.cursor()
#3.准备sql
sql = 'select version()'
#4.执行sql
b.execute(sql)
#5.提取结果
data = b.fetchall()
#6.关闭连接
a.close()
print(data)
>>>[{'version()': '5.7.28'}]
#如果用fetchone()提供结果
data = b.fetchone()
print(data)
>>>{'version()': '5.7.28'}
4. 代码优化
【就是把第2到5步封到 try: 里】
import pymysql
#1. 连接数据库
db = pymysql.connect('localhost','root','','test',
charset = 'utf8mb4',
cursorclass = pymysql.cursors.DictCursor)
try:
#2. 创建游标
cursor = db.cursor()
#3. 准备sql
sql = 'select * from stu where name = "cc"'
#4. 执行sql
cursor.execute(sql)
#注意!如果此时print(cursor.execute(sql)),打印结果为执行的行数
db.commit() # 在执行sql语句时,注意进行提交
#5. 提取结果
data = cursor.fetchall()
print(data)
# 注意!如果执行的是非查询类sql,则无返回结果,也就是print(data)输出为None
except:
# 当代码出现错误时,进行回滚
# 这样之前的执行就不会生效
# 可写可不写
db.rollback()
#6. 不管怎么样,最后都要关闭连接
finally:
db.close()