1. 程式人生 > 其它 >資料備份與pymysql模組

資料備份與pymysql模組

目錄

資料備份與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()