【一】pymysql
1.我們可以利用pymysql在python中操作數據庫
原理是pyMySQL-->是封裝好的執行subprocess鏈接數據庫執行數據庫命令的模塊
官網:https://zetcode.com/python/pymysql/
【二】使用示例
import pymysql
from pymysql.cursors import DictCursor
?
# 1.鏈接服務端
conn=pymysql.connect(host='127.0.0.1',#mysql服務端地址port=3306,#mysql默認port端口號user='root',#統一寫rootpasswd='llh011223',#密碼database='school',#數據庫charset='utf8'#字符編碼,千萬不要多加杠,會報錯
)
#2.產生獲取命令的游標對象
cursor = conn.cursor(DictCursor)#括號內不加參數,則是元組 不夠精確 添加參數變成字典
# 3.編寫sql語句
sql='select * from student;'
# 4.執行sql語句
cursor.execute(sql)
# 5.獲取結果
res=cursor.fetchall()
print(res)
?
【三】大部分參數介紹
user=用戶名---》寫root就行
password=密碼,
host=IP 本地 127.0.0.1 / localhost,
database= 需要連接到哪個數據庫,
port=端口,--》mysql3306
charset=編碼集,utf8
# sql_mode=嚴格模式,
cursorclass=Cursor 獲取查詢集的顯示結果樣式,--->寫DictCursor,結果默認字典了
connect_timeout=10,
autocommit=False 自動執行提交,
passwd=輸入密碼, password---》縮寫
db=需要連接到哪個數據庫---》database縮寫
【四】獲取結果各種方法
(1)cursor.fetchall()-->獲取全部結果
沒有指定顯示結果樣式的時候的結果是元組
((1, 'Jack', '100'), (2, 'Lucy', '100'), (3, 'Lily', '100'))
指定了DictCursor-->列表套字典
[{'sno': 1, 'sname': 'Jack', 'classno': '100'}, {'sno': 2, 'sname': 'Lucy', 'classno': '100'}]
(2)cursor.fetchone()-->獲取一條結果就是一個字典--》一條信息數據
(3)cursor.fetchmany(size=指定條數)--》獲取指定數量的結果
(4)scroll--》cursor.scroll(1, 'relative') ?# 相對于當前位置往后移動一個單位cursor.scroll(1, 'absolute') ?# 相對于起始位置往后移動一個單位
【五】原生操作的使用增刪改查
(1)插
?
【1】方式一:直接寫原生的SQL語句
sql = 'insert into user(username,password) values("dream","123456")'
指定 SQL 語句
cursor.execute(sql)
?
【2】方式二:格式化傳入參數
%s 位置站位--->最常使用sql = 'insert into user(username,password) VALUES(%s, %s)'
execute 執行SQL語句傳入數據的時候按照位置進行傳入數據
cursor.execute(sql, ['opp', '123456'])
cursor.execute(sql, ('opp', '123456'))
?
【3】方式三:關鍵字傳入參數
sql = 'insert into user(username,password) VALUES(%(name)s, %(pwd)s)'
cursor.execute(sql, {'name': "ppp", 'pwd': "123456"})
【4】批量插入數據
(1)方案一:遍歷每一個數據然后插入數據
'''
name_list = [i for i in 'dream']
password_list = [str(i) for i in range(5)]
data_all = list(zip(name_list, password_list))
#[('d', '0'), ('r', '1'), ('e', '2'), ('a', '3'), ('m', '4')]
sql = 'insert into user(username,password) VALUES(%s, %s)'
for data in data_all:cursor.execute(sql, data)
'''
# (2)方案2 : 一次性批量插入數據
name_list = [i for i in 'dream']
password_list = [str(i) for i in range(5)]
data_all = list(zip(name_list, password_list))
sql = 'insert into user(username,password) VALUES(%s, %s)'
cursor.executemany(sql, data_all)
# 生效就需要提交事務
conn.commit()
?
# (3)方案3 : 一次性批量插入數據sql = 'insert into userinfo(name,password) values(%s,%s)'cursor.executemany(sql,[('tom',123),('lavin',321),('pony',333)])
(2)刪
【1】直接寫SQL語句sql = 'delete from user where id =2;'
cursor.execute(sql)
【2】站位
sql = 'delete from user where id =%s;'
cursor.execute(sql,[3])
?
【3】關鍵字站位
sql = 'delete from user where id =%(id)s;'
cursor.execute(sql, {'id': 4})
(3)改
【1】直接寫
sql = 'update user set password="666" where id=5'
cursor.execute(sql)
【2】站位
sql = 'update user set password=%s where id=%s'
cursor.execute(sql,['999',5])
【3】關鍵字站位
sql = 'update user set password=%(new_password)s where id=%(id)s'
cursor.execute(sql, {'new_password': '<PASSWORD>', 'id': 5})
(4)查
【1】直接寫
sql='select * from user where name="llh";'
【2】站位
sql='select * from user where name=%s;'
cursor.execute(sql,('llh'))
【3】關鍵字站位
sql='select * from user where name=%(name)s;'
cursor.execute(sql,{'name':'llh'})
【六】SQL注入問題
【一】問題 : 不用正確的密碼即可登錄成功
# 用戶名和密碼都不需要也可以登錄
(1)輸入帶注釋
SELECT * FROM users WHERE username = '' OR '1'='1' -- ' AND password = '$password';
因為在SQL中注釋語法都是 注釋標志 -- + 一個或多個空格
(2)將篩選條件變為 1【二】SQL注入的解決辦法# 使用官方提供并建議的傳值方式進行傳值# %s# %(name)s