python代码连接mysql数据库
有bug(sql注入的问题):
#pip3 install pymysql import pymysql user=input('user>>: ').strip() pwd=input('password>>: ').strip() # 建立链接 conn=pymysql.connect( host='192.168.10.15', port=3306, user='root', password='123', db='db9', charset='utf8' ) # 拿到游标 cursor=conn.cursor() # 执行sql语句 sql='select * from userinfo where user = "%s" and pwd="%s"' %(user,pwd) rows=cursor.execute(sql) cursor.close() conn.close() # 进行判断 if rows: print('登录成功') else: print('登录失败')
在sql语句中 --空格 就表示后面的被注释了,所以密码pwd就不验证了,只要账户名对了就行了,这样跳过了密码认证就是sql注入
这样的连用户名都不用知道都可以进入,所以在注册账户名时好多特殊字符都不让使用,就怕这个.
改进版(防止sql注入):
#pip3 install pymysql import pymysql user=input('user>>: ').strip() pwd=input('password>>: ').strip() # 建立链接 conn=pymysql.connect( host='192.168.10.15', port=3306, user='root', password='123', db='db9', charset='utf8' ) # 拿到游标 cursor=conn.cursor() # 原来的执行sql语句 # sql='select * from userinfo where user = "%s" and pwd="%s"' %(user,pwd) # print(sql) # 现在的 sql='select * from userinfo where user = %s and pwd=%s' rows=cursor.execute(sql,(user,pwd)) #原来是在sql中拼接,现在是让execute去做拼接user和pwd cursor.close() conn.close() # 进行判断 if rows: print('登录成功') else: print('登录失败')
增删改:先安装pymysql模块(pip install pymysql)
#1、增删改 import pymysql # 建立链接 conn=pymysql.connect( host='127.0.0.1',#本地连接时就用127.0.0.1,如果远程连接时就查一下对方ip再写进来 port=3306, user='root', password='123', db='db9', charset='utf8' ) # 拿游标 cursor=conn.cursor() # 执行sql # 增、删、改 sql='insert into user(user,pwd) values(%s,%s)'#增删改就自己写sql语句即可,insert,update,drop #插入一条 # rows=cursor.execute(sql,('wxx','123')) # print(rows) #插入多条 # rows=cursor.executemany(sql,[('yxx','123'),('egon1','111'),('egon2','2222')]) # print(rows) rows=cursor.executemany(sql,[('egon3','123'),('egon4','111'),('egon5','2222')]) print(cursor.lastrowid)#查看你当前id走到了多少,如果是7,那么你再插入数据时,id就从7开始 conn.commit()#必须加这个才能保存,否则增删改不保存 # 关闭 cursor.close() conn.close()
查询:
# 2、查询 import pymysql # 建立链接 conn=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', db='db9', charset='utf8' ) # 拿游标 # pymysql.cursors.DictCursor写这个当你拿到查询数据时会以字典形式显示, # 字段名是键,字段内容是值,如果不写只写conn.cursor(), # 你拿到的就是一个大元组,都是字段的内容,没有字段的名,你不知道是什么数据 cursor=conn.cursor(pymysql.cursors.DictCursor) # 执行sql # 查询 # 实际上就是你cursor已经将sql查询的内容已经写到固定地方了, # 每次你都是你那里拿数据,拿一次光标走一次,跟读文件很类似 rows=cursor.execute('select * from user;') print(rows)#只显示受影响行数,而没有其他内容 #取法一,fetchone只拿一条 print(cursor.fetchone())#拿到第一条内容 print(cursor.fetchone())#拿到第二条内容,一次只取一条内容 print(cursor.fetchone())#取空了,再取就会显示None #取法二,fetchmany拿多条 print(cursor.fetchmany(2))#指定取几条数据 #取法三:fetchall全部拿出 print(cursor.fetchall())#拿出所有内容 print(cursor.fetchall())#再拿就显示[]而不是None #移动光标,再取 # 现在你可以移动光标,让你取完内容后可以再取一遍 cursor.scroll(3,mode='absolute') # 相对绝对位置移动, # 相当于从头开始,光标移动到从头数第三行记录的末尾,你再取就从id=4开始取 print(cursor.fetchone()) cursor.scroll(2,mode='relative') # 相对当前位置移动 # 向后跳,如果你当前id=1,你执行后再取就会变成id=4,把2和3两行跳过了 print(cursor.fetchone()) # 关闭 cursor.close() conn.close()