avatar

目录
利用python连接MySQL数据库

1、准备工作:

(1)事先在系统中已经安装好mysql数据库
(2)在系统控制台通过pip install pymysql,安装python的第三方数据库模块

2、利用python连接数据库

python
1
2
3
4
#导入模块
import pymysql
# 连接数据库
conn = pymysql.connect(host="127.0.0.1",user="root",password="123",database="test",charset="utf8")

需要注意的是:为避免出现中文乱码,最好填写charset=”utf8”,中间没有”-“,若写成”utf-8”是错误的。
如果觉得麻烦的话,有个方法,首先找到系统中pymysql包安装的位置,在cmd中输入pip show 模块名即可找到。
然后进入”pymysql”文件夹,找到里面的”connections.py”文件并打开,”ctrl+F”找到”charset”默认情况下是空值,输入”utf8”,同样不需要”-“。
3So4Ve.png
到此你就完成了对系统中的数据库的连接。

3、创建数据库表格

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#获取一个光标对象
cursor = conn.cursor()
#定义一个sql语句
sql = '''
create table employee(
eid char(10) not null,
ename char(10),
whno char(10),
salary float,
primary key(eid)
)
'''
# 执行sql语句
cursor.execute(sql)
# 关闭光标对象
cursor.close()
# 关闭数据库连接
conn.close()

4、增、删、改操作

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import pymysql
conn = pymysql.connect(host='localhost', user='root', password='123', db='test', charset='utf8')
cursor = conn.cursor()
# 增操作
sql = "insert into employee values ('001', '王三', '301', 1000.0)"
cursor.execute(sql)
# 也可同时插入多条数据
# sql = "insert into employee values ('%s')"
# cursor.executemany(sql,[('001', '王三', '301', 1000.0),('002', '李四', '302', 3000.0)])
# 改操作
# sql = "update employee set ename = "小李" where id = '001'"
# cursor.execute(sql)
# 删操作
# sql = "delete from employee where eid = '001'"cursor.execute(sql)
#一定记得commit
conn.commit()
cursor.close()
conn.close()

这里值得注意的是,必须要在完成操作之后使用commit()命令进行提交,否则操作的数据不生效。

5、数据的查询操作

fetchone():获取下一行数据,第一次为首行;
fetchall():获取所有行数据源
fetchmany(n):获取n行数据
(1)使用fetchone():

python
1
2
3
4
5
6
7
8
9
10
11
12
import pymysql
conn = pymysql.connect(host='localhost', user='root', password='123', db='test', charset='utf8')
cursor = conn.cursor()
sql = 'select * from employee'
cursor.execute(sql)
rst = cursor.fetchone()
print(rst)
# 查询第二行数据
next_rst = cursor.fetchone()
print(next_rst)
cursor.close()
conn.close()

运行结果:

python
1
2
3
('001', '王三', '301', 1000.0)
('002', '李四', '302', 3000.0)
>>>

(2)使用fetchall():

python
1
2
3
4
5
6
7
8
9
10
import pymysql
conn = pymysql.connect(host='localhost', user='root', password='123', db='test', charset='utf8')
cursor = conn.cursor()
sql = 'select * from employee'
cursor.execute(sql)
# 获取所有的数据
rsts= cursor.fetchall()
print(rsts)
cursor.close()
conn.close()

运行结果:

python
1
2
(('001', '王三', '301', 1000.0), ('002', '李四', '302', 3000.0))
>>>

默认情况下,我们获取到的返回值是元组,只能看到每行的数据,却不知道每一列代表的是什么,这个时候可以使用以下方式来返回字典,每一行的数据都会生成一个字典:

python
1
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

在fetchone示例中,在获取行数据的时候,可以理解开始的时候,有一个行指针指着第一行的上方,获取一行,它就向下移动一行,所以当行指针到最后一行的时候,就不能再获取到行的内容,所以我们可以使用如下方法来移动行指针:

python
1
2
cursor.scroll(1,mode='relative') # 相对当前位置移动
cursor.scroll(2,mode='absolute') # 相对绝对位置移动

第一个值为移动的行数,整数为向下移动,负数为向上移动,mode指定了是相对当前位置移动,还是相对于首行移动

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pymysql
conn = pymysql.connect(host='localhost', user='root', password='123', db='test', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = 'select * from employee'
cursor.execute(sql)
# 查询第一行的数据
rst = cursor.fetchone()
print(rst)
# 查询第二行数据
rst = cursor.fetchone()
print(rst)
cursor.scroll(-1,mode='relative') #设置之后,光标相对于当前位置往前移动了一行,所以打印的结果为第二行的数据
rst = cursor.fetchone()
print(rst)
cursor.scroll(0,mode='absolute') #设置之后,光标相对于首行没有任何变化,所以打印的结果为第一行数据
rst = cursor.fetchone()
print(rst)
cursor.close()
conn.close()

#结果如下

python
1
2
3
4
{'Eid': '001', 'Ename': '王三', 'Whno': '301', 'Salary': 1000.0}
{'Eid': '002', 'Ename': '李四', 'Whno': '302', 'Salary': 3000.0}
{'Eid': '002', 'Ename': '李四', 'Whno': '302', 'Salary': 3000.0}
{'Eid': '001', 'Ename': '王三', 'Whno': '301', 'Salary': 1000.0}

(3)使用fetchmany():

python
1
2
3
4
5
6
7
8
9
10
import pymysql
conn = pymysql.connect(host='localhost',user='root', password='123', db='test', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = 'select * from employee'
cursor.execute(sql)
# 获取2条数据
rsts = cursor.fetchmany(2)
print(rsts)
cursor.close()
conn.close()

#结果如下:

python
1
[{'Eid': '001', 'Ename': '王三', 'Whno': '301', 'Salary': 1000.0}, {'Eid': '002', 'Ename': '李四', 'Whno': '302', 'Salary': 3000.0}]

文章作者: J.M.
文章链接: https://www.masj.top/post/c1194323.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Jason的小世界