首先咱們知道pymysql 是python中操做數據庫的模塊python
1.與數據庫服務器創建連接 conn=pymysql.Connect(....)mysql
2.獲取遊標對象(用於發送和接受數據)cursor=conn.cursor()sql
3.使用遊標執行sql語句cursor.excute(sql)-->此時返回的是執行該語句後數據庫表中受影響的數據條數數據庫
4.使用fetch方法來獲取執行的結果安全
5.關閉鏈接:先關閉遊標,再關閉鏈接服務器
id | caption |
---|---|
1 | 三年級二班 |
2 | 三年級三班 |
3 | 一年級二班 |
4 | 二年級九班 |
import pymysql conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='root', database='day41', charset='utf8' ) cursor = conn.cursor(pymysql.cursors.DictCursor) # 將查詢結果作成字典格式 res = cursor.execute('select * from class') # 返回的值是受影響數據的條數 print(res) # 查詢到的數據總條數 print(cursor.fetchone()) # 獲取一條查詢結果 # cursor.scroll(1, 'absolute') # 絕對移動:相對於文件起始位置,向後移動一組數據 # cursor.scroll(1,'relative') # 相對移動,相對於當前位置,向後移動一個位置 cursor.scroll(-1) # 遊標 相對移動到當前位置的前一條數據位置 # 獲取全部剩餘的內容查詢的內容的字典 --》相似於文件讀寫的遊標 print(cursor.fetchall()) # [{'cid': 2, 'caption': '三年三班'}, {'cid': 3, 'caption': '一年二班'}, {'cid': 4, 'caption': '二年九班'}] cursor.close() # 關閉遊標 conn.close() # 關閉鏈接
上面所示的是咱們在python中pymysql的最簡單的用法,在實際中,咱們在對數據庫的讀取操做的時候,是不須要進行commit提交處理的,可是在對錶的增和改操做的時候,數據庫默認是啓用事務的,sql語句若是沒有提交至關於沒有執行。fetch
id | name | password | money |
---|---|---|---|
1 | qzk | 123 | 1000 |
2 | qby | 123 | 1000 |
3 | qwe | 123 | 1000 |
4 | zdc | 123 | 1000 |
5 | qqq | 123 | 1000 |
# -*- coding: utf-8 -*- import pymysql # Connect 類 實例化一個 conn鏈接對象 conn = pymysql.Connect( host='127.0.0.1', user='root', port=3306, password='root', database='day41', charset='utf8' ) # 獲取遊標對象 cursor = conn.cursor(pymysql.cursors.DictCursor) # 這裏演示一下 rollback()做用:當有兩個或多個操做因其餘緣由只完成部分操做而未能執行徹底部操做致使的數據不安全問題,能夠對錶數據中的增改進行撤銷處理。 try: res1 = cursor.execute("update userinfo set money = money-50 where name= 'qqq'") print(cursor.fetchall()) res = cursor.execute("update userinfo set money =money-50 where name= 'ewr'") if not res: # 該處演示當 res 返回值爲0時,表示該操做未對數據庫產生影響,由於ewr不在數據庫中,因此返回0,此事上一句操做 res1 已操做完畢,用戶帳戶餘額已減去50 ,故,須要撤銷上面的操做,因此用 rollback() print('轉帳失敗') conn.rollback() except: conn.rollback() cursor.execute("select * from userinfo") # 執行語句查看數據庫的userinfo全部字段信息,返回收影響的數據條數 print(cursor.fetchall()) # 查看到上面語句執行的結果 # 提交修改 由於pymysql模式默認是啓用事務的,sql語句若是沒提交至關於沒執行 conn.commit() # 提交事務 """ 注意:pymysql 默認不提交修改的,可是這裏指的是對錶中的記錄操做不提交,像諸如刪庫、刪表的操做時沒法撤銷的 """
# -*- coding: utf-8 -*- import pymysql # 建立鏈接獲得一個鏈接對象 conn = pymysql.Connect( host='127.0.0.1', # 數據庫服務器主機地址 port=3306, # 端口號,可選 user='root', # 數據庫用戶名 password='root', # 數據庫密碼 database='day41', # 數據庫名稱 charset='utf8' # 編碼 ) while True: name_inp = input('>>>username:').strip() pwd_inp = input('>>>>pwd:').strip() # 獲取遊標對象 cursor = conn.cursor(pymysql.cursors.DictCursor) sql = 'select * from userinfo where name=%s and password=%s' # cursor 執行sql res = cursor.execute(sql, (name_inp, pwd_inp)) print(res) # sql注入 if res: print('登陸成功') print(cursor.fetchone()) # 查詢一個 break else: print('登陸失敗,用戶名或密碼錯誤') # 關閉遊標 cursor.close() # 關閉鏈接 conn.close() """ 通常咱們不要本身手動拼接(關鍵參數)查詢條件(會致使sql注入) """
# 不要手動去拼接查詢的sql語句 username = input(">>>:").strip() password = input(">>>:").strip() sql = "select * from user where username='%s' and password='%s'"%(username,password) # 用戶名正確 username >>>: jason' -- jjsakfjjdkjjkjs # 用戶名密碼都不對的狀況 username >>>: xxx' or 1=1 --asdjkdklqwjdjkjasdljad password >>>: ''
# 增 sql = "insert into user(username,password) values(%s,%s)" rows = cursor.excute(sql,('jason','123')) # 修改 sql = "update user set username='qzksdb' where id=1" rows = cursor.excute(sql) """ 增和改單單執行excute並不會真正影響到數據,須要再執行conn.commit()才能夠完成真正的增改 """ # 一次插入多行記錄 res = cursor,excutemany(sql,[(),(),()]