python连接数据库
可以通过python代码连接数据库,这种流程通常是固定的:
import pymysql #创建连接 con=pymysql.Connect() #创建游标 cursor=con.cursor() #改动一条数据 cursor.execute #改动多条数据 cursor.executemany #提交,不然无法保存新建或者修改的数据 con.commit() #关闭游标 cursor.close() #关闭连接 con.close()
增
操作的数据有多条值
如果要操作的数据有多个值,将值写在元组中
如:
effect_row=cursor.execute("insert into student(sname,gender,class_id) values(%s,%s,%s)",(name,gen,class_i))
一条语句操作多条数据
如果想要一条语句操作多条数据,将多组数据放在一个可迭代的数据中
effect_row=cursor.executemany("insert into student(sname,gender,class_id) values(%s,%s,%s)",[('二黄','女','3'),('二黑','男','2')])
查
查的时候对数据没有修改,因此不需要commit(),不需要提交数据
cursor.execute 返回的是sql语句所涉及的行的总数
要获得查询语句的结果,还要在execute后使用fetch*方法,如下所示.
要获得查询语句的结果,还要在execute后使用fetch*方法
fetchone():这个方法每次之获取一条数据。返回的是一个字符串
fetchall():这个方法接收全部的返回结果。,返回的结果都是元组
fetchmany(size):可以获取指定条数的数据,,返回的结果都是元组
lastrowid :获取最后添加的数据
a=cursor.execute('insert into class(caption) values(%s)','网络三班') con.commit() c=cursor.lastrowid 获取新创建的数据ID 如果一次插入多条数据,只能获取最后添加的数据的id
修改游标
以上方法获取数据,类似于游标,取一个数据后,下次只能从第二个数据开始获取
因此,就有了调整游标位子的方法
cursor.acroll(游标位置,mode='absolute') 设置游标的绝对位置
cursor.acroll(当前游标的前后位置,填正负数,mode='relative')设置游标的相对位置,正数往前,负数往后
cursor.acroll(1,mode='relative') #当前游标往下取一个位置 cursor.acroll(-5,mode='relative') #当前游标往前回5个位置
fetchall 和fetchmany
能够返回数据库查询语句的结果,fetchall返回全部结果,fetchmany返回指定数量的结果
返回的结果都是元组,在取数据库某个具体列的值时不方便,
可以对创建游标操作进行修改,将语句cursor=con.cursor()添加cursor=pymysql.cursors.DictCursor
即:
cursor=con.cursor(cursor=pymysql.cursors.DictCursor)
就成定制游标,字典形式数据
在取数时也就可以使用列名来获取数据
cursor=con.cursor(cursor=pymysql.cursors.DictCursor) a=cursor.execute('select sname as f,gender as sex from student') c=cursor.fetchall()
sql注入问题
在输入动态参数时,要使用参数形式的语句,不能使用字符拼接,会出现sql注入的问题
如:
ql='select username,psd from userinfo where username="%s" and psd="%s"' sql1=sql%('alex','123456')
这里,因为sql语句的注释符号为--。所以如果用户在输入用户名和密码时,加入--就可以将psd的验证注释,只要正确输入用户名即可,如alex--
如果再加上一个判断语句,不用输入正确的用户名,也可以成功登录 ,如'alexc or 1==1 --','asdasd' ,
用户名和密码都不对,但依然可以通过验证
importlib
importlib模块支持传递字符串来导入模块。
如下:
import importlib m=importlib.import_module(module)
导入模块module将其命名为m
用法:再使用反射取寻找模块中的变量和函数
getattr(m,'add')() #执行模块module中的add()方法

浙公网安备 33010602011771号