資料備份與pymysql模組
阿新 • • 發佈:2021-06-25
目錄
資料備份與pymysql模組
一 IDE工具介紹
生產環境還是推薦使用mysql命令列,但為了方便我們測試,可以使用IDE工具Navicate。
掌握: #1. 測試+連結資料庫 #2. 新建庫 #3. 新建表,新增欄位+型別+約束 #4. 設計表:外來鍵 #5. 新建查詢 #6. 備份庫/表 #注意: 批量加註釋:ctrl+?鍵 批量去註釋:ctrl+shift+?鍵
二 pymysql模組
1 安裝
pip3 install pymysql
2 連結、執行sql、關閉(遊標)
import pymysql # 連結 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123', database='tom', charset='utf8mb4') # 遊標(命令列介面的游標) cursor = conn.cursor() # 執行完畢返回的結果集預設以元組顯示 # 執行sql語句 # 建立表tom sql = 'create table tom(id int primary key auto_increment,' \ 'name varchar(20) charset utf8mb4,' \ 'password varchar(20) charset utf8mb4)' print(sql) res = cursor.execute(sql) print(res) # 更新表tom,並進行操作 sql = 'insert tom(name,password) values(%s,%s);' print(sql) res = cursor.execute(sql, ('tom', '123')) # 執行sql語句,返回sql查詢成功的記錄數目 conn.commit() # 提交後才發現表中插入記錄成功 print(res)
# 進行查詢操作 user = input('使用者名稱: ').strip() pwd = input('密碼: ').strip() sql = 'select * from tom where name="%s" and password="%s"' % (user, pwd) # 注意%s需要加引號 res = cursor.execute(sql) # 執行sql語句,返回sql查詢成功的記錄數目 cursor.close() conn.close() if res: print('login successfull') else: print('lohin failed')
3 execute()之 sql注入 **
# 注意:**
符號--會註釋掉它之後的sql,正確的語法:--後至少有一個任意字元。
# 原理:**
根據程式的字串拼接name='%s',我們輸入一個 "xxx' -- haha",用我們輸入的xxx加單引號 ‘ 在程式中拼接成一個判斷條件name="xxx' -- haha"。
# 最後那一個空格,在一條sql語句中如果遇到select * from tom where id > 3 -- and name='name'; 則--之後的條件被註釋掉了。
# 1) sql注入之:使用者存在,繞過密碼
tom' -- 任意字元
# 2) sql注入之:使用者不存在,繞過使用者密碼
xxx' or 1=1 -- 任意字元
"解決方法:"
# 原來是我們對sql進行字串拼接
# sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)
# print(sql)
# res=cursor.execute(sql)
# 改寫為(execute幫我們做字串拼接,我們無需且一定不能再為%s加引號了)
sql="select * from userinfo where name=%s and password=%s" # !!!注意%s需要去掉引號,因為pymysql會自動為我們加上
res=cursor.execute(sql,[user,pwd]) # pymysql模組自動幫我們解決sql注入的問題,只要我們按照pymysql的規矩來。
4 增、刪、改:conn.commit()
import pymysql#連結conn=pymysql.connect(host='localhost',user='root',password='123',database='tom')#遊標cursor=conn.cursor()#執行sql語句# part1# sql='insert into userinfo(name,password) values("root","123456");'# res=cursor.execute(sql) #執行sql語句,返回sql影響成功的行數# print(res)# part2# sql='insert into userinfo(name,password) values(%s,%s);'# res=cursor.execute(sql,("root","123456")) #執行sql語句,返回sql影響成功的行數# print(res)#part3sql='insert into userinfo(name,password) values(%s,%s);'res=cursor.executemany(sql,[("root","123456"),("xxx","12356"),("qqq","156")]) #執行sql語句,返回sql影響成功的行數print(res)conn.commit() # 提交後才發現表中插入記錄成功cursor.close()conn.close()
5 查:fetchone(), fetchmany(num), fetchall()
"cursor.fetchone()"——>一次獲取一個結果;"cursor.fetchmany(num)"——>一次獲取多個結果; "*cursor.fetchall()"——>一次獲取(剩餘) 所有。 "cursor.scroll(3,mode='absolute')"——>相對絕對位置移動3;"cursor.scroll(3,mode='relative')"——>相對當前位置移動3。
import pymysql#連結conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')#遊標cursor=conn.cursor()#執行sql語句sql='select * from userinfo;'rows=cursor.execute(sql) # 執行sql語句,返回sql影響成功的行數rows,將結果放入一個集合,等待被查詢# cursor.scroll(3,mode='absolute') # 相對絕對位置移動# cursor.scroll(3,mode='relative') # 相對當前位置移動res1=cursor.fetchone()res2=cursor.fetchone()res3=cursor.fetchone()res4=cursor.fetchmany(2)res5=cursor.fetchall()print(res1)print(res2)print(res3)print(res4)print(res5)print('%s rows in set (0.00 sec)' %rows)conn.commit() #提交後才發現表中插入記錄成功cursor.close()conn.close()'''(1, 'root', '123456')(2, 'root', '123456')(3, 'root', '123456')((4, 'root', '123456'), (5, 'root', '123456'))((6, 'root', '123456'), (7, 'lhf', '12356'), (8, 'eee', '156'))rows in set (0.00 sec)'''
6 獲取插入的最後一條資料的自增ID
cursor.lastrowid ——>獲取插入的最後一條資料的自增ID。
# **cursor.lastrowid**import pymysqlconn=pymysql.connect(host='localhost',user='root',password='123',database='egon')cursor=conn.cursor()sql='insert into userinfo(name,password) values("xxx","123");'rows=cursor.execute(sql)print(cursor.lastrowid) # 在插入語句後檢視conn.commit()cursor.close()conn.close()