python中pymysql模塊常用方法以及其使用
首先我們知道pymysql 是python中操作數據庫的模塊
使用步驟分為如下幾步:
1.與數據庫服務器建立鏈接 conn=pymysql.Connect(....)
2.獲取游標對象(用於發送和接受數據)cursor=conn.cursor()
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語句如果沒有提交相當於沒有執行。
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注入問題
# 不要手動去拼接查詢的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,[(),(),()]