MySQL——>pymysql操作
1.pymysql 是以专门用于操作Mysql的数据模块。与Django框架不同,它可以直接将代码写在.py的文件中。
import pymysql
connection=pymysql.connect(host='127.0.0.1',post=3306,user='root',
password='root',db='test') #创建数据库的连接,用户和密码都是'root',使用的数据库是'test'
cursor=connection.cursor() #创建游标
cursor.execute('原生的sql语句') #直接执行sql语句、
connection.commit() #游标提交
cursor.close()
connection.close()
假如需要参数的传递,则必须为:
inp=input("请输入班级:")
r=cursor.execute('insert into test(name) values (%s)',inp)
如果是利用字符串进行拼接完成sql的操作,则很可能会被sql注入(绝对禁止)
执行一条行数据是利用r=cursor.execute(),执行多条则是r=cursor.executemany()
R=cursor.executemany('insert into test(gender,id,name) values (%s,%s,%s)',result1)
connection.commit()
print(r)---->R不是显示cursor的执行内容,是显示cursor执行收影响的行数。(坑)
其中,result是一个可迭代的元组类型,result=( () , () , () )根据顺序被一对一对应。
一个是execute/一个是executemany(“多条数据操作执行”)。result放进去做一个循环添加
(注意:)在利用pymsql驱动做数据库操作时,增、删、改都是需要connection.commit()
但是查(select)是不需要的。可以直接cursor.execute()执行。
R=cursor.execute('select * from test')
print(R) # 这个结果会显示受影响的行数,但不会显示表的结果。
result=R.fetchall() #显示以元祖为单位的结果
result=R.fetchone() #显示一条结果
result=R.fetchmany(指定条数)
cursor.execute('select * from test') #将结果全部放到内存中
操作fetchall()和fetchone()时,一定要考虑指针的位置。
当cursor.execute(‘select * from test’)后result1=cursor.fetchall()在进行
result2=cursor.fetchone()时,显示结果为None。
result1 | 结果1 |
---|---|
result2 | None |
原因是result1操作后,指针默认移到最后一个位置,再去找数据就会发现已经没有数据了.
这个时候就需要利用cursor.scroll(num,mode)来移动游标位置
相对移动和绝对移动:
cursor.scroll(1,mode='relative') #相对位置的移动
cursor.scroll(-1,mode='relative')
相对位置移动举例子,当前位置在2 则cursor.scroll(1,mode='relative')就是在2的基础上向下移动一个单位,变成3
cursor.scroll(-1,mode='relative') 就是在2的基础上向上一个单位变成1
cursor.scroll(0,mode='absolute')#位置的绝对移动
假如当前的位置是2,fetchone()一次后是3,在执行cursor.scroll(o,mode='absolute')
再次fetchone()下标就会变成1.
sql注入:
1.利用字符串去进行sql的注入
sql='select * from userinfo where username='%s'' and password='%s'
sql=sql%('alex''or 1=1 --',1236)
这样就完成了sql注入,注入完成后,where的条件就变成了
where username='alex' or 1=1 -- and password="%s"
因为sql语句中,'--'代表的是注释的意思,那么将后半段注释后,"alex" or 1=1 这句话就永恒成立了
则可以利用这一漏洞进行登陆。
2.cursor=connection.cursor()
这句话游标被execute执行的时候,fetchall即是多元组((),(),)
而fetchone()是单元组,要是想元组变换成字典类型就需要
cursor=connection.cursor(cursor=pymsql.cursor.Dictcursor)
3.select Sname as f from Student; 意思为将Sname字段的值作为f单独一列呈现出来
4.获取最新的自增Id (对于Auto_crement)
new_id =cursor.lastrowid