因爲本人的Python版本爲python3.7,因此用pymysql來鏈接數據庫(mysqldb不支持python3.x)html
#在cmd輸入
pip3 install pymysql
[File] >> [settings] >> [Project: study] >> [Project Interpreter] >>點擊右上角「+」號,搜索框輸入「pymysql」>> [Install按鈕]python
import pymysql # 建立連接獲得一個連接對象 conn = pymysql.Connect( host="127.0.0.1", # 數據庫服務器主機地址 user="root", # 用戶名 password="123456", # 密碼 database="test", #數據庫名稱 port=3306, # 端口號 可選 整型 charset="utf8" # 編碼 可選 )
還可使用函數的形式鏈接數據庫:mysql
import pymysql def connect_mysql(): db_info = { 'host':'192.168.13.253', 'user':'zfj', 'password':'123', 'port':3306, 'database':'day40', 'charset':'utf8' } try: db = pymysql.Connect(**db_info) print('鏈接成功!') except Exception as e: print('e') return db if __name__ == '__main__': db = connect_mysql()
commit()#提交穩定存儲的更改 rollback()#回滾當前事務 autocommit_mode=無 #指定的自動提交模式。無表示使用服務器默認值。
要想操做數據庫必須先創建遊標對象,不須要本身建立調用數據庫對象下面的cursor方法就能夠了sql
建立遊標:數據庫
db = pymysql.connect(config) # 建立數據庫連接對象 cus = db.cursor # 建立遊標對象 print(dir(cus)) # 查看遊標的方法
遊標經常使用方法:python3.x
cus.cursor() #建立遊標對象 cus.close() #關閉遊標對象 cus.excute(query,args=None) #執行查詢 參數: query(str) - 要執行的查詢。 args(元組,列表或字典) - 與查詢一塊兒使用的參數。(可選的) 返回:受影響的行數 返回類型:INT executemany(查詢,args ) #針對一個查詢運行多個數據 參數: query - 要在服務器上執行的查詢 args - 序列或映射的序列。它用做參數。 此方法可提升多行INSERT和REPLACE的性能。不然它等同於使用execute()循環遍歷args。 cus.fetchone() #獲取下一行 cus.fetchall() #獲取全部行 cus.fetchmany(size =None) #獲取幾行
注:sql必須是字符串類型安全
import pymysql # 建立連接獲得一個連接對象 conn = pymysql.Connect( host="127.0.0.1", # 數據庫服務器主機地址 user="root", # 用戶名 password="admin", # 密碼 database="day42", #數據庫名稱 port=3306, # 端口號 可選 整型 charset="utf8" # 編碼 可選 ) # 獲取遊標對象 pymysql.cursors.DictCursor指定 返回的結果類型 爲字典 默認是元祖類型 cursor = conn.cursor(pymysql.cursors.DictCursor) # # 添加數據 # res = cursor.execute("insert into emp values(100,'胡歌','男',30,1,'job',60000)") # if res: # print("插入成功") # else: # print("插入失敗") # 提交修改 由於pymysql 模塊默認是啓用事務的 你的sql語句 若是不提交 至關於沒有執行 # conn.commit() # res = cursor.execute("drop database day42") # res = cursor.execute("delete from t1 where id = 1") # print(res) try: cursor.execute("update moneyTable set money = money - 50 where name = '小明'") #若是小花的帳戶出問題了 沒法更新數據 那就須要回滾 cursor.execute("update moneyTable set money = money + 50 where name = '小花'") conn.commit() except: conn.rollback() cursor.close() conn.close() # 小明有100塊 準備給小花轉50 # update moneyTable set money = money - 50 where name = "小明"; # 發生一些別錯誤 若是發生了錯誤 就執行撤銷操做 rollback; # update moneyTable set money = money + 50 where name = "小花";
如何保證數據安全是近幾年來火熱的主題之一,這裏不細講,就說一些和pymysql相關的sql注入攻擊。服務器
#sql = "select *from user where user = '%s' and pwd = '%s';" % (input("input userName"),input("input password")) # 當用戶輸入的用戶名爲字符串 爲 yy' -- 時 # 最終產生的sql select *from user where user = 'yy' -- ' and pwd = '987657890'; # -- 用於mysql註釋 意思是 後面的內容忽略掉 # 從而致使 密碼是否正確都能登陸成功 # "select *from user where user = 'axxax' or 1=1;
那python是如何避免普通的sql注入的呢?ide
經過excute函數,將須要傳的參數放到arg參數中,讓pymysql幫你屏蔽函數
count = cursor.execute("select *from user where user = %s and pwd = %s;",args=(input("user"),input("pwd"))) print(count) if count: print("login success") else: print("login error") cursor.close() conn.close()
讀者想要學習更多關於安全的內容能夠關注「實驗吧」學習:http://www.shiyanbar.com/
部分參考 pymysql文檔:https://pymysql.readthedocs.io/en/latest/index.html
鏈接對象規範:https://www.python.org/dev/peps/pep-0249/#connection-objects