Python 与 MySQL 数据通讯需要安装第三方包:
pyMySQL
,安装教程如下:
pip3 安装
sudo apt install python3-pip
pymysql安装
sudo pip3 install pymysql
安装命令:
sudo pip3 install
第三方包名
卸载命令:sudo pip3 uninstall
第三方包名
查看第三方包信息:pip3 show
第三方包名
pip3 list
: 查看使用pip命令安装的第三方包列表
如果实现将10000条数据插入到MySQL数据库?
如果使用之前学习的MySQL客户端来完成这个操作,那么这个工作量无疑是巨大的,可以通过使用程序代码的方式去连接MySQL数据库,然后对MySQL数据库进行增删改查的方式,实现10000条数据的插入,像这样使用代码的方式操作数据库
就称为数据库编程
。
步骤如下:
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()返回一个元组
,如(1,'张三')- 获取查询结果中的
所有数据
:cur.fetchall()返回一个元组
,如((1,'张三'),(2,'李四'))- 关闭游标:
cur.close()
表示和数据库操作完成
# 1.0 导入pymysql包
import pymysql
if __name__ == '__main__':
# 2.0 创建连接对象
conn = pymysql.connect(host='localhost',
port=3306,
user='root',
password='qianli01',
database='pyhon3',
charset='utf8')
# 3.0 获取游标
cursor = conn.cursor()
# 4.0 执行sql语句
# 准确sql语句
sql = "select * from students;"
cursor.execute(sql)
# 获取查询结果
# fetchone一次拿一个值,
first = cursor.fetchone()
print('第一个值')
print(first)
second = cursor.fetchone()
print('第二个值')
print(second)
print('全部')
all = cursor.fetchall()
print(all)
# 5.0 关闭游标
cursor.close()
# 6.0 关闭连接
conn.close()
image.png
备注:获取查询结果
fetchone()
和fetchall()
方法都是将结果集中数据取出,每取一个,结果集的数据就少一个
防止SQL注入
SQL注入:用户提交带有恶意的数据与SQL语句进行字符串方式的拼接,从而影响了SQL语句的语义,最终产生数据泄露的现象
如何防止SQL注入?
SQL语句参数化
SQL语言中的参数使用%s来占位,此处不是python中的字符串格式化操作
将SQL语句中%s占位所需要的参数存在一个列表中,把参数列表传递给execute方法中第二个参数
// 被sql注入的语句,导致查询的结果是表的全部内容
sql ="select * from students where name = '%s'" % "黄蓉 'or 1 = 1 or '"
// 打印sql结果:select * from students where name = '黄蓉 'or 1 = 1 or ''
# 正确写法:
# 使用防止sql注入的sql语句,%s是sql语句的参数和字符串里面的%s不一样,不要加上引号
sql = "select * from students where name = %s"
cursor.execute(sql,("三",))
防止sql注入多个参数的使用
import pymysql
if __name__ == '__main__':
conn = pymysql.connect(host='localhost',
port=3306,
user='root',
password='qianli01',
database='pyhon3',
charset='utf8')
cursor = conn.cursor()
sql = "insert into students(name,age) values(%s,%s)"
# 插入数据,多个参数
try:
# 执行sql语句的传入参数,参数类型可以是元组,列表,字典
cursor.execute(sql,["力",20])
# 提交数据
conn.commit()
except Exception as e:
# 撤销操作
conn.rollback()
finally:
cursor.close()
conn.close()
网友评论