1. 程式人生 > >8-5 Navicat工具與pymysql模組

8-5 Navicat工具與pymysql模組

一 Navicat

    在生產環境中操作MySQL資料庫還是推薦使用命令列工具mysql,但在我們自己開發測試時,可以使用視覺化工具Navicat,以圖形介面的形式操作MySQL資料庫

需要掌握的基本操作

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

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

pymysql模組

一 介紹

   之前我們都是通過MySQL自帶的命令列客戶端工具mysql來操作資料庫,那如何在python程式中操作資料庫呢?這就用到了pymysql模組,該模組本質就是一個套接字客戶端軟體,使用前需要事先安裝

pip3 install pymysql

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

import pymysql
user=input('使用者名稱: ').strip()
pwd=input('密碼: ').strip()

#連結
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon',charset='utf8')
#遊標
cursor=conn.cursor() #執行完畢返回的結果集預設以元組顯示
#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
#執行sql語句 sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) #注意%s需要加引號 print(sql) res=cursor.execute(sql) #執行sql語句,返回sql查詢成功的記錄數目 print(res) cursor.close() conn.close() if res: print('登入成功') else: print('登入失敗')

三 execute()之sql注入

注意:符號--會註釋掉它之後的sql,正確的語法:--後至少有一個任意字元

根本原理:就根據程式的字串拼接name='%s',我們輸入一個xxx' -- haha,用我們輸入的xxx加'在程式中拼接成一個判斷條件name='xxx' -- haha'

最後那一個空格,在一條sql語句中如果遇到select * from t1 where id > 3 -- and name='egon';則--之後的條件被註釋掉了

#1、sql注入之:使用者存在,繞過密碼
egon' -- 任意字元

#2、sql注入之:使用者不存在,繞過使用者與密碼
xxx' or 1=1 -- 任意字元

image


解決方法:

# 原來是我們對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的規矩來。

增、刪、改:conn.commit()


import pymysql
#連結
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')
#遊標
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)

#part3
sql='insert into userinfo(name,password) values(%s,%s);'
res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")]) #執行sql語句,返回sql影響成功的行數
print(res)

conn.commit() #提交後才發現表中插入記錄成功
cursor.close()
conn.close()

查:fetchone,fetchmany,fetchall

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)
'''

獲取插入的最後一條資料的自增ID

import pymysql
conn=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()