MySQL— pymysql模块(防止sql注入),可视化软件Navicat
Posted 阿橙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL— pymysql模块(防止sql注入),可视化软件Navicat相关的知识,希望对你有一定的参考价值。
一.Pymysql
import pymysql #python2.X 中是 mysqldb 和 pythonmysql 用法是一模一样的 #pymysql可以伪装成上面这两个模块 user = input(\'username: \') pwd = input(\'password: \') #连接数据库 conn = pymysql.connect(host=\'localhost\',user=\'root\',password=\'gkx321\',database=\'db222\') cursor = conn.cursor() #类似文件句柄。 比如conn是打开了一个柜子,cursor就是我们拿东西的手 # cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #设置为字典格式,fetch的时候可以显示字段名,以字典形式 #注意以后绝对不要这么拼接 # sql = "select * from userinfo where username=\'%s\' and password = \'%s\' "%(user,pwd) # username: uu\' or 1=1 -- # password: gkx # (1, \'gkx\', \'gkx123\') # 登陆成功 #正确方式 sql = "select * from userinfo where username = %s and password = %s " #三种方式 元组,列表,字典 # cursor.execute(sql) cursor.execute(sql,(user,pwd)) #执行语句 ,末尾加不加逗号都行 #r = cursor.execute(sql,(user,pwd)) #有个返回值,表示受影响的行数 # cursor.execute(sql,[user,pwd]) # sql = "select * from userinfo where username = %(u)s and password = %(p)s " # cursor.execute(sql,{\'u\':user,\'p\':pwd}) ret = cursor.fetchone() #fetchone类似 readline 运行一次,只读取一行。 print(ret) cursor.close() conn.close() if ret: print(\'登陆成功\') else: print(\'登陆失败\')
#总结 #查询需要 fetchone #更新和insert 需要 conn.commit() #create drop alter 只要 cursor.execute() import pymysql conn = pymysql.connect(host=\'localhost\',user=\'root\',password=\'gkx321\',database=\'db222\') # cursor = conn.cursor() #类似文件句柄。 比如conn是打开了一个柜子,cursor就是我们拿东西的手 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #设置为字典类型的 cursor \'\'\' #增加 删除 改 # user = \'ccc\' # pwd = \'ccc123\' sql = "insert into userinfo(username,password) values(%s,%s)" # cursor.execute(sql,(user,pwd,)) cursor.executemany(sql,[(\'ww\',\'ww123\'),(\'aaa\',\'aaa123\')]) #增加多行,只适合insert时候用 # r = cursor.execute(sql,(user,pwd,)) #返回值,受影响的行数 conn.commit() #增删改 三种操作一定要 commit 不提交数据库不知道要修改 for 循环中 可以 全部execute后,再进行一次 commit \'\'\' #查 sql = "select * from userinfo" cursor.execute(sql) # 既然fetchone像文件中的readline,那么就有类似 tell和seek的语句: cursor.scroll(2,mode=\'relative\') #根据当前位置,相对移动 .2表示从当前位置,选择下下行,自然1就是选择下一行了 cursor.scroll(2,mode=\'absolute\') #根据绝对位置移动 2表示从第1行往后的2行,即表示选择第3行 #可以通过设置cursor,来让fetchone显示的时候,带上字段名,以字典形式 ret = cursor.fetchone() #只有查询的时候才需要 print(ret) ret = cursor.fetchone() print(ret) ret = cursor.fetchall() print(ret) # # ret1 = cursor.fetchall() #返回一个元组,每条数据又是一个元组 # print(ret1) #要注意的是,尽量还是要用sql语句操作,因为比如fetchall/fetchmany 会把所有数据放到内存中来,比如10万条数据,那么是相当占内存的 #还是建议用 sql中的 limit 分页 # ret1 = cursor.fetchall() # ret2 = cursor.fetchmany(3) cursor.close() conn.close()
#新插入数据的自增id cursor.lastrowid import pymysql conn = pymysql.connect(host=\'localhost\',user=\'root\',password=\'gkx321\',database=\'db222\') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) sql = "insert into userinfo(username,password) values(\'ddd\',\'ddd123\')" cursor.execute(sql) print(cursor.lastrowid) # #获取插入数据的自增id #那如果是插入多行呢,也只获取最后一行的 自增id,所以有需要外键的话,只能一个个插入再获取 conn.commit() cursor.close() conn.close()
import pymysql import sys conn = pymysql.connect(host=\'localhost\',user=\'root\',password=\'gkx321\',database=\'db222\') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) def select(sql,cursor,conn): ret = cursor.execute(sql) print(\'受影响行数为%s行\'%ret) ret2 = cursor.fetchall() return ret2 def drop(sql,cursor,conn): ret = cursor.execute(sql) return \'\\033[34m操作成功\\033[0m\' def change(sql,cursor,conn): ret = cursor.execute(sql) conn.commit() if ret: return \'\\033[34m受影响行数为%s行\\033[0m\'%ret else: print(\'输入不正确\') return False # def quit(sql, cursor, conn): # print(\'退出了\') # exit() def login(cursor,conn): count = 0 while count<3: user = input(\'用户名:\') pwd = input(\'密码:\') sql = "select * from user where username=%s and password=%s" ret = cursor.execute(sql,(user,pwd)) if ret: sql = "select * from u_g left join grant_info on u_g.g_id = grant_info.id left join user on u_g.u_id = user.id;" cursor.execute(sql) ret = cursor.fetchall() for line in ret: if line[\'username\'] == user: print(\'%s的权限是%s\'%(line[\'username\'],line[\'grant_lst\'])) return True else: print(\'用户信息有误\') count += 1 return False def op(): while True: menu = [(\'查询\',\'select\'), (\'增加\',\'change\'), (\'新建表\',\'drop\'), (\'删除\',\'drop\'), (\'更新\',\'change\'), (\'退出\',\'\') ] for index,item in enumerate(menu,1): if index < len(menu): print(\'%s:%s\'%(index,item[0]),end=\' \') else: print(\'%s:%s\'%(index,item[0])) try: choi = int(input(\'选择操作序号:\')) if choi == 6: print(\'\\033[31m已选择退出\\033[0m\') break print(\'\\033[32m进行%s操作\\033[0m\' % menu[choi - 1][0]) except: print(\'\\033[31m选择有误,请输入序号\\033[0m\') continue print(\'\\033[34m输入sql语句,或者按q返回\\033[0m\') sql = input(\'输入sql命令>>:\') if sql == \'q\': continue try: func = getattr(sys.modules[__name__], menu[choi - 1][1]) ret = func(sql, cursor, conn) if choi != 1: print(ret) else: for index,item in enumerate(ret): print(item) except: print(\'\\033[31m语法有误,重新输入\\033[0m\') cursor.close() conn.close() ret = login(cursor, conn) if ret: op()
pymysql作业1:简单实现用pymysql进行数据库管理
import random import pymysql conn = pymysql.connect(host=\'localhost\',user=\'root\',password=\'gkx321\',database=\'db300w\',charset=\'utf8\') cursor = conn.cursor() # # name = \'alex\' # emai = \'email\' # for i in range(0,2000000): # i = str(i) # gender = random.choice([\'男\', \'女\']) # sql = "insert into userinfo(name,email,gender) values(%s,%s,gender)" # cursor.execute(sql % (name+i,emai+i)) # conn.commit() # # cursor.close() # conn.close() name = \'alex\' emai = \'email\' for i in range(3,3000001): gender = random.choice([\'男\', \'女\']) sql = " update userinfo set gender=\'%s\' where id =%s;"% (gender,i) cursor.execute(sql) conn.commit() cursor.close() conn.close() #sql 拼接的时候,如果 %s 不加单引号,那么sql语句里也不会有单引号
pymysql作业2:用pymysql向表格插入300万条数据
# ===>要先问清楚,要求是什么:公司开发一个项目,假设100天,可能有70天在明确需求 # 1. 基于角色的权限管理 # 2. 明确需求分析 # 基于角色的权限管理 # # 用户信息 # id username pwd role_id # 1 alex 123123 1 # 2 eric 123123 1 # # 权限 # 1 订单管理 # 2 用户劵 # 3 Bug管理 # .... # # 角色表: # 1 IT部门员工 # 2 咨询员工 # 3 IT主管 # # 角色权限管理 #角色 #权限 # 1 1 # 1 2 # 3 1 # 3 2 # 3 3 #那如果一个用户有多个角色呢,可以再多一个表 角色和用户关系表
要先问清楚,要求是什么:公司开发一个项目,假设100天,可能有70天在明确需求
import pymysql conn = pymysql.connect(host=\'localhost\',user=\'root\',password=\'gkx321\',database=\'sql_homework\',charset=\'utf8\') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.callproc(\'p3\',(12,2)) #n1是12,无所谓n2是多少,不影响 ret = cursor.fetchall() print(ret) #out的值要这么获取,固定写法 cursor.execute(\'select @_p3_0,@_p3_1\') #可以只写一个 0获取n1,1获取n2 ret = cursor.fetchall() print(ret) \'\'\' 为什么格式是这样呢,因为pymysql内部帮我们做了这样子的操作 set @ _p3_0 = 12 set @ _p3_1 = 2 call p3( @ _p3_0,@_p3_1) select @ _p3_0,@_p3_1 \'\'\' # cursor.execute(\'select * from teacher\') # ret = cursor.fetchall() # print(ret) cursor.close() conn.close()
# http://www.runoob.com/mysql/mysql-sql-injection.html # https://www.cnblogs.com/sdya/p/4568548.html # sql = "select * from userinfo where username=\'%s\' and password = \'%s\' "%(user,pwd) #如果我们这么拼接字符串 # 当 %s 传入为 uu\' or 1=1 -- 那么sql语句变为 # sql = "select * from userinfo where username=\'uu\' or 1=1 -- \' and password = \'%s\' "%(user,pwd) (-- 为sql中的注释符号) # 从而让sql变得不安全,可以随便登陆 具体见 上面例子中,《pymysql初识》
二.navicat是MySQL其中一个可视化软件
#·······建议还是用终端使用MySQL······· #通过以下2步才能用 8.0登陆 navicat: # mysql加密规则 https://www.cnblogs.com/atuotuo/p/9402132.html # ALTER USER \'root\'@\'localhost\' IDENTIFIED WITH mysql_native_password BY \'gkx321\'; # 把mysql 8.0加密规则 从caching_sha2_password 更改为 mysql_native_password # Update user set host=\'%\' where user=\'root\'; # select user,host,plugin from user #我们用navicat这个IDE,主要还是为了学习过程中,存储和查看命令 #生产过程中一定不要用,会被鄙视。 \'\'\' #1.转储数据库文件: #对着db右键,可以把数据库的结构和数据导出 #导入的话,直接新建查询,把sql的文件粘贴进入,运行即可。 #那在终端要怎么备份呢? #用 mysqldump #备份:数据表结构和数据 #打开cmd 输入命令: mysqldump -u root db1 > db1.sql -p 回车输入密码即可 #保存位置在 cmd行输入时候的路径,文件名为 db1.sql #只备份:数据表结构: #mysqldump -u root -d db1 > db1.sql -p #多了个 -d #那备份的怎么导入呢? #首先创建一个数据库 create database db_name; #命令: mysqldump -uroot -p密码 db_name < 文件路径 \'\'\'
D:\\python-全栈九期\\navicat12
以上是关于MySQL— pymysql模块(防止sql注入),可视化软件Navicat的主要内容,如果未能解决你的问题,请参考以下文章