一.下载
终端输入指令:pip3 install pymysql
二.开始使用
1.py文件中导入该模块
import pymysql
2.连接数据库服务器
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='', db='db8', charset='utf8')
# 参数解读:
# host: 服务器地址;
# port: 服务器端口号, 这里注意要是 int;
# user: 登录用户;
# password: 用户密码;
# db: 要连接的库的名字;
# charset: 编码格式;
3.创建游标对象(用来执行命令)
cursor = conn.cursor()
4.执行sql语句
sql = "select * from userinfo where username='%s' and pwd='%s'" %(user, pwd) # 自己拼接时,%s一定要引起来.
result=cursor.execute(sql)
print(result) # 这里打印的是数据的个数,一般不需要.
# 注意: 这里会产生sql 注入的问题, 后面会写, 要着重注意这一点
4.1一次插入多个数据使用executemany
sql = 'insert into user_info(name, password) values(%s, %s)'
rows = cursor.executemany(sql, [('xxx', 123), ('000', 1233), ('yyy', 12345)])
4.2对目标表进行增、删、改操作涉及到对数据库的修改,必须进行二次确认
commit()方法:在数据库里增、删、改的时候必须要进行提交,否则插入的数据不生效。
- 无论是哪个操作一定要进行conn.commit(),不然数据会丢失。
- 或者在连接数据库时,加一个参数autocommit = True就可省略commit()。
import pymysql
username = input('请输入用户名:')
pwd = input('请输入密码:')
conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db8', charset='utf8')
cursor = conn.cursor()
# 增:
# 插入一条数据:
# sql = "insert into userinfo(username,pwd) values (%s,%s)"
# effect_row = cursor.execute(sql,(username,pwd))
# 同时插入多条数据:
# cursor.executemany(sql,[('李四','110'),('王五','119')])
# 改:
# sql = "update userinfo set username = %s where id = 2"
# effect_row = cursor.execute(sql,username)
# 删:
# sql = "delete from userinfo where id = 2"
# effect_row = cursor.execute(sql)
#一定记得commit
conn.commit()
# 4.关闭游标
cursor.close()
# 5.关闭连接
conn.close()
5.关闭游标,断开连接。
cursor.close()
conn.close()
6.获取查询数据
- 获取命令执行的查询结果
print(cursor.fetchone()) # 获取第一条数据
print(cursor.fetchall()) # 获取所有数据
print(cursor.fetchmany(n)) # 指定拿n条数据
# 读取数据类似文件光标的移动,取完一条数据下一个命令从下一个数据开始取
- 相对移动:相对于光标所在位置向后移动n条数据
cursor.scroll(n, 'relative')
- 绝对移动:从文件起始位置向后移动n条数据
cursor.scroll(n, 'absolute')
三.sql注入问题
1.sql注入介绍
利用一些语法的特性,书写一些特定的语句实现固定的语法。
日常生活中很多软件注册时都不能含有特殊符号,因为怕你构造出特定的语句入侵数据库,不安全。
Mysql中利用的是Mysql的注释语法。
- 假设用户不知道密码,用户输入jason’ - - jhsadk…
select * from user where name = 'jason' -- jhsadk... and password='';
# -- 后面被注释了
- 用户用户名和密码都不知道,用户输入 xxx’ or 1=1 - - jhsadk…
select * from user where name = 'xxx' or 1 = 1 -- jhsadk... and password='';
# 1 = 1 永真
2.sql注入解决方式
先用%s占位,之后将需要拼接的数据直接交给execute方法即可。
sql = "select * from user where name=%s and password=%s;"
# execute会自动识别sql中的%s,然后用元组替换
rews = cursor.execute(sql, (username, password))