每日分享:
每一个想努力的念头,都是未来的你在向现在的你求救。
目录
一、PyMySQL的使用
安装pymysql第三方包:
pymysql的使用:
1. 导入pymysql包
2. 创建连接对象
3. 获取游标对象
4. pymysql完成数据的查询操作
5. pymysql完成对数据的增删改
6. 防止SQL注入
一、PyMySQL的使用 安装pymysql第三方包:pip install pymysql
说明:
- 安装命令使用 pip install 第三方包名
- 卸载命令使用 pip uninstall 第三方包
- 可以使用pip show pymysql命令查看第三方包的信息
- 可以使用pip list 查看使用pip命令安装的第三方包列表
import pymysql
2. 创建连接对象调用pymysql模块中的connect()函数来创建连接对象
conn = connect(参数列表)
- 参数host:连接的mysql主机,如果是本机则为'localhost'
- 参数port:连接的mysql主机的端口,默认为3306
- 参数user:连接的用户名
- 参数password:连接的密码
- 参数database:数据库的名称
- 参数charset:通信采用的编码方式,一般为utf8
连接对象操作说明:
- 关闭连接:conn.close()
- 提交数据:conn.commit()
- 撤销数据:conn.rollback()
获取游标对象的目的就是要执行sql语句,完成对数据库的增、删、改、查操作
调用连接对象的cursor()方法获取游标对象
cur = conn.cursor()
游标操作说明:
- 使用游标执行sql语句:execute(operation [parameters])执行SQL语句,返回受影响的行数,主要用于执行insert、update、delete、select等语句
- 获取查询结果集中的一条数据:cur.fetchone()返回一个元组
- 获取查询结果集中的所有数据:cur.fetchall()返回一个元组,其中每条数据也是一个元组
- 关闭游标:cur.close() 表示和数据库操作完成
# 导包
import pymysql
# 创建连接对象
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='数据库的密码',
database='hello',
charset='utf8'
)
# 获取游标对象(游标就好比一个搬运工,把sql语句交给数据库,把数据库返回的结果交给python)
cursor = conn.cursor()
sql = 'select * from students;'
# 执行sql语句
cursor.execute(sql)
# 获取查询结果(fetchone返回第一个结果,fetchall返回所有结果)
# row = cursor.fetchone()
# print(row)
res = cursor.fetchall()
for i in res:
print(i)
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
结果:
我们再对比ubuntu中数据库的数据:
import pymysql
conn = pymysql.connect(
user='root',
password='密码',
host='localhost',
database='hello',
port=3306,
charset='utf8'
)
cursor = conn.cursor()
# sql = 'insert into classes(name) values("新增数据");'
# sql = 'update classes set name="修改数据" where id=4;'
sql = 'delete from classes where id=4;'
try:
# 执行sql语句
cursor.execute(sql)
# 提交增删改数据
conn.commit()
except Exception as e:
# 回滚数据,即撤销刚刚进行的sql语句操作
conn.rollback()
finally:
cursor.close()
conn.close()
说明:
- conn.commit() 表示将修改操作提交到数据库
- conn.rollback() 表示回滚数据
添加数据之前:
运行python添加数据之后:
运行python修改数据之后:
运行python删除数据之后:
什么是SQL注入?
用户提交带有恶意的数据与SQL语句进行字符串方式的拼接,从而影响了SQL语句的语义,最后出现数据泄露的现象
如何防止SQL注入?
SQL语句参数化:
- SQL语言中的参数使用%s来占位,这不是python中的字符串格式化操作
- 将SQL语句中%s占位所需要的参数存在一个列表(或元组或字典)中,把参数列表传递给execute方法中的第二个参数
SQL注入代码:
# 导包
import pymysql
# 创建连接对象
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='密码',
database='hello',
charset='utf8'
)
# 获取游标对象(游标就好比一个搬运工,把sql语句交给数据库,把数据库返回的结果交给python)
cursor = conn.cursor()
sql = "select * from students where name= '%s';" % "张三' or 1 = 1 or'"
# 执行sql语句
cursor.execute(sql)
# 获取查询结果(fetchone返回第一个结果,fetchall返回所有结果)
# row = cursor.fetchone()
# print(row)
res = cursor.fetchall()
for i in res:
print(i)
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
结果(返回了所有数据):
防止SQL注入代码:
# 导包
import pymysql
# 创建连接对象
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='密码',
database='hello',
charset='utf8'
)
# 获取游标对象(游标就好比一个搬运工,把sql语句交给数据库,把数据库返回的结果交给python)
cursor = conn.cursor()
sql = "select * from students where name= %s;"
# 执行sql语句
cursor.execute(sql, ["张三' or 1 = 1 or'"])
# 获取查询结果(fetchone返回第一个结果,fetchall返回所有结果)
# row = cursor.fetchone()
# print(row)
res = cursor.fetchall()
for i in res:
print(i)
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
结果(没有查询到结果):
正常输入时才会查询到结果:
# 导包
import pymysql
# 创建连接对象
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='密码',
database='hello',
charset='utf8'
)
# 获取游标对象(游标就好比一个搬运工,把sql语句交给数据库,把数据库返回的结果交给python)
cursor = conn.cursor()
sql = "select * from students where name= %s;"
# 执行sql语句
cursor.execute(sql, ["张三"])
# cursor.execute(sql, ["张三' or 1 = 1 or'"])
# 获取查询结果(fetchone返回第一个结果,fetchall返回所有结果)
# row = cursor.fetchone()
# print(row)
res = cursor.fetchall()
for i in res:
print(i)
# 关闭游标
cursor.close()
# 关闭连接
conn.close()