資料庫:pymysql模組

來源:互聯網
上載者:User

標籤:通過   --   close   art   相對   user   rowid   用戶端   base   

 一 介紹

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

pip3 install pymysql

  

二 連結、執行sql、關閉(遊標)
import pymysqluser=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注入

根本原理:就是根據程式的字串拼接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 -- 任一字元

  

使用者名稱存在,直接登入成功

 

 使用者名稱不存在,繞過使用者和密碼

 

解決方案:

# 原來是我們對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注入的問題print(res)

  

四 增、刪、改:conn.commit()

import pymysql# 連結conn = pymysql.connect(host=‘192.168.159.128‘, user=‘root‘, password=‘pertest‘, database=‘luffycity‘, charset=‘utf8‘)# 遊標cursor = conn.cursor()# 執行sql語句# 新增# part1# sql = "insert into userinfo(name,password) values (‘mike‘,‘123‘);"# res = cursor.execute(sql)   # 執行sql語句,返回sql影響成功的行數# print(res)# par2sql = "insert into userinfo(name,password) values (%s,%s);"res = cursor.execute(sql, ("mike2", "123"))   # 執行sql語句,返回sql影響成功的行數print(res)# par3,插入多行sql = "insert into userinfo(name,password) values (%s,%s);"res = cursor.executemany(sql, [("mike2", "123"), ("mike3", "123"), ("mike4", "123")])   # 執行sql語句,返回sql影響成功的行數print(res)conn.commit()   # 提交後才發現表中插入記錄成功cursor.close()conn.close()

  

五 查:fetchone,fetchmany,fetchall

 

 

import pymysql# 連結conn = pymysql.connect(host=‘192.168.159.128‘, user=‘root‘, password=‘pertest‘, database=‘luffycity‘, charset=‘utf8‘)# 遊標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 row in set(0.00 sec)‘ % rows)conn.commit()cursor.close()conn.close()

  

五 擷取插入的最後一條資料的自增ID
import pymysql# 連結conn = pymysql.connect(host=‘192.168.159.128‘, user=‘root‘, password=‘pertest‘, database=‘luffycity‘, charset=‘utf8‘)# 遊標cursor = conn.cursor()sql = ‘insert into userinfo(name, password) values ("mike6", "123");‘rows = cursor.execute(sql)print(cursor.lastrowid)     # 在插入語句後查看conn.commit()cursor.close()conn.close()

  

資料庫:pymysql模組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.