一、模块导入

  • 安装第三方模块pymysql,然后导入
1
2
# 导入 pymysql
import pymysql

二、创建连接对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建connect()对象
conn = pymysql.connect( host = 'localhost',
port = 3306,
user = 'root',
password = 'root',
database = 'mysql',
charset = 'utf8')

# 参数host:连接的mysql主机,如果本机是'localhost'
# 参数port:连接的mysql主机的端口,默认是3306
# 参数user:连接的用户名
# 参数password:连接的密码
# 参数database:数据库的名称
# 参数charset:通信采用的编码方式,推荐使用utf8

连接对象相关操作

  • 关闭连接:conn.close()
  • 提交数据:conn.commit()
  • 撤销数据:conn.rollback()
  • 将修改操作提交到数据库:conn.commit()
  • 回滚数据:conn.rollback()

三、获取游标对象

目的:执行sql语句,完成对数据库的增、删、改、查操作

1
2
# 调用cursor()方法获取游标对象   
cur = conn.cursor()

游标相关操作

  • 执行sql语句,并返回受影响的行数:cur.execute()
  • 获取查询结果集中的一条数据,返回一个元组:cur.fetchone()
  • 获取查询结果集中的所有数据,返回一个元组:cur.fetchall()
  • 关闭游标:cur.close()

四、数据操作

1. 查询数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import pymysql

# 创建connect()对象
conn = pymysql.connect( host = 'localhost',
port = 3306,
user = 'root',
password = 'root',
database = 'mysql',
charset = 'utf8')

# 获取游标对象
cursor = conn.cursor()
# 查询sql语句
sql = 'select * from info;'
# 执行sql,返回sql语句在执行过程中影响的行数
row_count = cursor.execute(sql)
print('SQL语句执行影响的行数:%d' % row_count)

# 取出结果中第一行数据
print(cursor.fetchone())

# 取出结果中的所有数据
for line in cursor.fetchall():
print(line)

# 关闭游标
cursor.close()
# 关闭连接
conn.close()

2. 修改数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import pymysql

# 创建connect()对象
conn = pymysql.connect( host = 'localhost',
port = 3306,
user = 'root',
password = 'root',
database = 'mysql',
charset = 'utf8')

# 获取游标对象
cursor = conn.cursor()

try:
# 添加sql语句
# sql = "insert into info values(95,'609998','东方树叶','1.88%','2.71%','16.00','15.00','2018-01-22');"
# 删除sql语句
# sql = "delete from info where id = 95"
# 修改sql语句
sql = "update info set short = '全新好' where id = 1"

# 执行sql,返回sql语句在执行过程中影响的行数
row_count = cursor.execute(sql)
print('SQL语句执行影响的行数:%d' % row_count)
# 提交数据到数据库
conn.commit()
except Exception as e:
print(e)
# 回滚数据,撤销刚刚的SQL语句操作
conn.rollback()

# 关闭游标
cursor.close()
# 关闭连接
conn.close()

五、防止SQL注入

  • SQL注入:用户通过字符串拼接影响SQL语句的语义,提交带有恶意的数据的SQL语句,最终产生数据泄露的现象
  • 防止SQL注入:SQL语句参数化,参数使用%s来占位,将%s占位所需要的参数存在一个列表中,把参数列表传递给execute方法中第二个参数(execute方法中的 %s 占位不需要带引号)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from pymysql import connect

def main():

find_name = input("请输入物品名称:")

# 创建Connection连接
conn = connect(host='localhost',port=3306,user='root',password='mysql',database='jing_dong',charset='utf8')
# 获得Cursor对象
cs1 = conn.cursor()

# # 非安全的方式
# 输入 ' or 1 = 1 or ' (单引号也要输入)
# # 即select * from goods where name='' or 1 = 1 or ''
# sql = "select * from goods where name='%s'" % find_name
# print("""sql===>%s<====""" % sql)
# # 执行select语句,并返回受影响的行数:查询所有数据
# count = cs1.execute(sql)

# 安全的方式
# 构造参数列表
params = [find_name]
# 执行select语句,并返回受影响的行数:查询所有数据
count = cs1.execute("select * from goods where name=%s", params)
# 注意:
# 如果要是有多个参数,需要进行参数化
# 那么params = [数值1, 数值2....],此时sql语句中有多个%s即可
# %s 不需要带引号

# 打印受影响的行数
print(count)
# 获取查询的结果
# result = cs1.fetchone()
result = cs1.fetchall()
# 打印查询的结果
print(result)
# 关闭Cursor对象
cs1.close()
# 关闭Connection对象
conn.close()

if __name__ == '__main__':
main()

附录-参考资料

PyMSQL官方文档

https://pymysql.readthedocs.io/en/latest/modules/connections.html