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()方法

 

posted @ 2020-11-08 22:43  maday  阅读(371)  评论(0)    收藏  举报