MySQL简单操作(python 数据库驱动)

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
result2None

原因是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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值