MySQL— pymysql模塊(防止sql註入),可視化軟件Navicat
阿新 • • 發佈:2018-10-20
字典類 open weight 學習 增加 所有 avi isp 實現
一.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就是我們拿東西的手pymysql初識# 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()pymysql—增刪改查
#新插入數據的自增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()新插入數據的自增id
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作業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作業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()Pymysql-存儲過程的操作
# 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初識》mysql註入
二.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 < 文件路徑 ‘‘‘navicat初識
D:\python-全棧九期\navicat12
安裝包
MySQL— pymysql模塊(防止sql註入),可視化軟件Navicat