文章目录
一、基本语句作用了解
import pymysql
#创建连接
conn = pymysql.connect(
host = '127.0.0.1', #地址
port = 3306, #端口号
user = 'ChengJiang_09', #账户
passwd = '123', #密码
db = 'student', #数据库名称
charset = 'utf8') #字符集编码
#创建游标
cursor = conn.cursor()
r = cursor.execute('insert into student_list(name) values("t9om")') #执行mysql功能语句,并返回受语句影响的表内数据的行数。r:此时接收到整数 1。
conn.commit()
cursor.close()
conn.close()
二、动态数据修改(两种方法)
1.字符串拼接sql语句 ( 禁止使用 ,原因见该部分末尾)
import pymysql
conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'ChengJiang_09',
passwd = '123',
db = 'student',
charset = 'utf8')
cursor = conn.cursor()
inp = input("请输入插入内容:")
sql = 'insert into student_list(name) values("%s")'%(inp,)
cursor.execute(sql)
conn.commit()
cursor.close()
conn.close()
①.字符串拼接bug(sql注入问题)
举例:
利用查询语句,简单模拟用户登录界面,即输入正确的账户和密码,取得相应信息
例表:
import pymysql
conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'ChengJiang_09',
passwd = '123',
db = 'student',
charset = 'utf8')
cursor = conn.cursor()
inp = input("请输入账户:")
inp2 = input("请输入密码:")
sql = 'select user_name,user_passwd from user_list3 where user_name="%s" and user_passwd="%s"'%(inp,inp2)
cursor.execute(sql)
result = cursor.fetchone()
print(result)
conn.commit()
cursor.close()
conn.close()
案例:
账户与密码不匹配,输出none
账户与密码匹配,正确输出
接下来查看问题所在:
此时,虽然密码错误,但是依然成功取出对应的数据*
原因:sql语句中 - - 作用:注释
当账户输入 ‘ “- - ’ 时
sql = 'select user_name,user_passwd from user_list3 where user_name="user1" -- " and user_passwd="%s"'
#此时 -- 后方的 " and user_passwd="%s" 被注释,将不再作为代码执行,所以无论输入任何密码都能成功取出改行内容
以上为存在user1账户,如果不存在:
输入 “ or 1=1 - - 依然能够成功取出数据(取出全部数据,上方取出一条数据原因在于:curcor.fetchone()语句,仅取一条数据)
该问题被命名为 sql注入
2.内部传参
import pymysql
conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'ChengJiang_09',
passwd = '123',
db = 'student',
charset = 'utf8')
cursor = conn.cursor()
inp = input("请输入插入内容:")
#execute方法内部会自动将传入的参数替换占位符(%s),%s不加“”。
cursor.execute('insert into student_list(name) values(%s)',inp)
conn.commit()
cursor.close()
conn.close()
三、数据增删改查
1.增
方法列表:
cursor.execute() #传入单行
cursor.executemany() #传入多行
功能介绍:
#以下语句student表作为举例
#单行插入
cursor.execute('insert into student(name,age,hobby) values(%s,%s,%s)',('Tom',12,'girl')) #同时传入多列数据,需要用元祖保存
#多行插入
list = [('Tom',12,'girl'),
('Tom11',13,'girls'),
('Tom22',14,'girlss'),]
cursor.executemany('insert into student(name,age,hobby) values(%s,%s,%s)',list) #executemany将循环插入数据
2.删
#以下语句以student_list表作为举例使用
cursor.execute('delete from student_list where nid = %s',5) #删除表中nid为5的行
3.改
#以下语句以student_list表作为举例使用
cursor.execute('update student_list set name = %s where nid = %s',('sbb',12)) #将nid为12的行,的name列数据更改为 sbb
4.查
#以下语句以student_list表作为举例使用
#取所有数据
cursor.execute('select * from student_list')
result = cursor.fetchall() #创建变量取得返回值,即表内容
#取单行数据
cursor.execute('select * from student_list')
result = cursor.fetchone() #取得第一条数据(拥有着相当于文件读取时的,文本指针)
result = cursor.fetchone() #取得第二条数据
result = cursor.fetchone() #取得第三天数据
#取指定行数据
result = cursor.fetchmany(3) #取三条数据
方法列表:
cursor.fetchall() #取所有数据
cursor.fetchone() #取得一条数据
cursor.fetchmany() #取指定条数据
①.修改文件指针
#修改指针的绝对位置
cursor.scroll(0,mode='absolute') #回到0位置
#修改指针的相对位置(负数向上,正数向下)
cursor.scroll(-1,mode='relative') #-1:移动指针到上一个位置
cursor.scroll(1,mode='relative') #1:移动指针到下一个位置
5.获取自增id
插入一条数据,想要取得其自增id
inp = input("请输入插入内容:")
cursor.execute('insert into student_list(name) values(%s)',inp)
nid = cursor.lastrowid #取得该行数据自增id
#一条execute语句同时插入多行数据时,仅会取得最后一条数据自增id
print("nid = %s"%nid)
方法列表:
cursor.lastrowid #取得数据自增id