1. 程式人生 > >MySQL->navicat、pyMySQL

MySQL->navicat、pyMySQL

MySQL->navicat、pyMySQL

#1. 測試+連結資料庫
#2. 新建庫
#3. 新建表,新增欄位+型別+約束
#4. 設計表:外來鍵
#5. 新建查詢
#6. 備份庫/表

#注意:
批量加註釋:ctrl+?鍵
批量去註釋:ctrl+shift+?鍵

PyMySQL模組

安裝—> pip3 install pymysql

一、連結、執行sql、關閉(遊標)

通過pyMySQL操作資料庫通常分4步

import pymysql

# 1、建立連線
con = pymysql.connect(host = 'localhost',port = 3306,user = 'root',password = '123',database = 'd11')
# 2、設定遊標
cursor = con.cursor(pymysql.cursors.DictCursor) # 設定遊標的具體型別,DictCursor以字典的形式拿到欄位名,預設以元組的形式
# 3、執行sql語句
sql = 'select * from emp;'
res = cursor.execute(sql) # 執行sql語句,返回sql查詢成功的記錄行數
# print(res)

# 需求:具體的一條條記錄
# tag = cursor.fetchone() # 執行語句,返回獲取的一條資料 第一條
# print(tag)
# tag = cursor.fetchone() # 執行語句,返回獲取的一條資料 第二條
# print(tag)
# print(cursor.scroll(1, mode='relative')) # 指標相對於上一次位置往後偏移1條記錄
# cursor.scroll(res - 2, mode='absolute')# 指標絕對, 遊標永遠從頭開始偏移

tag = cursor.fetchall()  # 執行語句,獲取所有資料
print(tag)
# 4、 關閉、斷開連線
cursor.close()
con.close()

# 使用執行的結果:
#       fetchone())當前遊標往後獲取一行記錄
#       fetchall()當前遊標往後所有的記錄
#       scroll(num, mode="relative|absolute")
#               relative: 遊標從當前位置往後移動num行
#               ablolute: 遊標從頭往後移動num行, 一般可以結合line來使用能定位到任意位置

二、pymysql處理sql注入

'''
sql語法中
註釋: /**/  | --  | #

什麼是sql注入:
通過書寫sql包含(註釋相關的)特殊字元, 讓原有的sql執行順序發生改變, 從而改變執行得到的sql

目的:
繞過原有的sql安全認證, 達到對資料庫攻擊的目的
'''
import pymysql
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='db2')
cursor = conn.cursor(pymysql.cursors.DictCursor)

# 登入

# 得到使用者輸入的賬戶密碼
usr = input("請輸入使用者名稱: ") #abc
pwd = input("請輸入密碼: ") #123

# sql注入
# 1.知道使用者名稱:  abc" -- hehe | ooo
# select * from user where usr="abc" -- hehe" and pwd="ooo"
# 2.不知道使用者名稱 aaa" or 1=1 -- hehe | 000
# select * from user where usr="aaa" or 1=1 -- hehe" and pwd="000"

# 處理方式
# 對輸入的賬戶密碼做完全處理 => 不可能形成達到sql注入的特殊語法 => 正則

# 和資料庫的賬戶密碼進行配對
# sql = 'select * from user where usr="%s" and pwd="%s"' % (usr, pwd)
# select * from user where usr="abc" and pwd="123"
# res = cursor.execute(sql)

# pymysql已經處理了sql注入
sql = 'select * from user where usr=%s and pwd=%s'
res = cursor.execute(sql, (usr, pwd))

# print(res)
if res:
    print('login success')
else:
    print('login failed')

cursor.close()
conn.close()

三、增刪改

import pymysql
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='db2')
cursor = conn.cursor(pymysql.cursors.DictCursor)

# 增
# sql1 = 'insert into user(usr, pwd) values (%s, %s)'
# cursor執行sql語句,在記憶體中完成了對資料的插入, 但不能將資料存放到硬碟
# 會將id完成自增
# 插入單條
# res = cursor.execute(sql1, ("opq", "123"))
# 插入多條
#res = cursor.executemany(sql1, [("aaa", "000"), ("bbb", "111")])
# print(res)
# 將記憶體中的資料提交給硬碟, 完成真實意義上的資料儲存
# conn.commit()

# 刪
# sql2 = 'delete from user where usr=%s'
# res = cursor.execute(sql2, ("aaa"))
# print(res)
# conn.commit()

# 改
sql3 = 'update user set pwd=%s where usr=%s'
res = cursor.execute(sql3, ("222", "bbb"))
conn.commit()

cursor.close()
conn.close()