Python 与 MySQL 交互
Posted 知其黑、受其白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 与 MySQL 交互相关的知识,希望对你有一定的参考价值。
阅读目录
Pymysql 的安装
每一个想努力的念头,都是未来的你在向现在的你求救。
安装 pymysql 第三方包:pip install pymysql
PS D:\\tmp> pip install pymysql
Collecting pymysql
Downloading PyMySQL-1.0.2-py3-none-any.whl (43 kB)
---------------------------------------- 43.8/43.8 kB 179.6 kB/s eta 0:00:00
Installing collected packages: pymysql
Successfully installed pymysql-1.0.2
PS D:\\tmp> pip show pymysql
Name: PyMySQL
Version: 1.0.2
Summary: Pure Python MySQL Driver
Home-page: https://github.com/PyMySQL/PyMySQL/
Author: yutaka.matsubara
Author-email: yutaka.matsubara@gmail.com
License: "MIT"
Location: c:\\users\\administrator\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.9_qbz5n2kfra8p0\\localcache\\local-packages\\python39\\site-packages
Requires:
Required-by:
PS D:\\tmp>
说明:
- 安装命令使用
pip install
第三方包名 - 卸载命令使用
pip uninstall
第三方包 - 可以使用
pip show pymysql
命令查看第三方包的信息 - 可以使用
pip list
查看使用 pip 命令安装的第三方包列表
PyMySQL 的使用
1 导入 pymysql 包
import pymysql
2 创建连接对象
调用 pymysql 模块中的 connect() 函数来创建连接对象。
conn = connect(参数列表)
参数host:连接的mysql主机,如果是本机则为'localhost'
参数port:连接的mysql主机的端口,默认为3306
参数user:连接的用户名
参数password:连接的密码
参数database:数据库的名称
参数charset:通信采用的编码方式,一般为utf8
连接对象操作说明:
关闭连接:conn.close()
提交数据:conn.commit()
撤销数据:conn.rollback()
3 获取游标对象
获取游标对象的目的就是要执行 sql 语句,完成对数据库的增、删、改、查操作。
调用连接对象的 cursor()方法获取游标对象
cur = conn.cursor()
游标操作说明:
- 使用游标执行 sql 语句:execute(operation [parameters]) 执行SQL语句,返回受影响的行数,主要用于执行 insert、update、delete、select 等语句。
- 获取查询结果集中的一条数据:cur.fetchone() 返回一个元组。
- 获取查询结果集中的所有数据:cur.fetchall() 返回一个元组,其中每条数据也是一个元组。
- 关闭游标:cur.close() 表示和数据库操作完成
pymysql 完成数据的查询操作
# 导包
import pymysql
# 创建连接对象
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='root',
database='tts',
charset='utf8'
)
# 获取游标对象(游标就好比一个搬运工,把sql语句交给数据库,把数据库返回的结果交给python)
cursor = conn.cursor()
sql = 'select * from users;'
# 执行sql语句
cursor.execute(sql)
# 获取查询结果(fetchone返回第一个结果,fetchall返回所有结果)
# row = cursor.fetchone()
# print(row)
res = cursor.fetchall()
for i in res:
print(i)
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
结果:
PS E:\\pdf1> python .\\img.py
(1, '计秀兰', 'velit_ducimus@example.com', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'rtdgo4jo52', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
(2, '郭子安', 'wdolores@example.net', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'D6dlh6DXLY', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
(3, '李全安', 'qcum@example.org', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'B8hzJBseiG', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
PS E:\\pdf1>
pymysql 完成对数据的增删改
import pymysql
conn = pymysql.connect(
user='root',
password='root',
host='localhost',
database='tts',
port=3306,
charset='utf8'
)
cursor = conn.cursor()
# sql = 'insert into classes(name) values("新增数据");'
# sql = 'update classes set name="修改数据" where id=4;'
sql = 'delete from users where id=2;'
try:
# 执行sql语句
cursor.execute(sql)
# 提交增删改数据
conn.commit()
except Exception as e:
# 回滚数据,即撤销刚刚进行的sql语句操作
conn.rollback()
finally:
cursor.close()
conn.close()
说明:
conn.commit() 表示将修改操作提交到数据库
conn.rollback() 表示回滚数据
防止 SQL 注入
什么是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 users 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()
结果(返回了所有数据):
PS E:\\pdf1> python .\\img.py
(1, '计秀兰', 'velit_ducimus@example.com', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'rtdgo4jo52', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
(2, '郭子安', 'wdolores@example.net', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'D6dlh6DXLY', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
(3, '李全安', 'qcum@example.org', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'B8hzJBseiG', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
PS E:\\pdf1>
防止 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 users 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()
以上是关于Python 与 MySQL 交互的主要内容,如果未能解决你的问题,请参考以下文章