python基礎篇-python操作mysql
阿新 • • 發佈:2018-02-25
class -c 密碼錯誤 字典類 input https relative 通過 tps
本篇對於Python操作MySQL主要使用兩種方式:
- 原生模塊 pymsql
- ORM框架 SQLAchemy
pymysql
下載安裝
pip3 install pymysql #pip3命令的路徑:安裝路徑下的Scripts目錄 # 下載 pymysql到本地 # 解壓到執行目錄 # python2,默認無pip命令 # python3,默認自帶pip3命令 python3 -m pip install --upgrade pip 更新pip #https://pypi.python.org/pypi 模塊源
使用操作
1.執行sql語句
1 #!/usr/bin/env python2 # -*- coding:utf-8 -*- 3 import pymysql 4 5 # 創建連接 6 conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘,charset=‘utf8‘) 7 # 創建遊標(創建連接只是打開了數據庫,要想取數據需要通過遊標來取) 8 cursor = conn.cursor() 9 10 # 執行SQL,並返回受收影響行數(即有一個返回值) 11 effect_row = cursor.execute("updatehosts set host = ‘1.1.1.2‘") 12 cursor.execute("insert into class(caption) values(‘全棧二班‘)") 13 14 # 執行SQL,並返回受影響行數,插入多行使用executemany 15 #effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)]) 16 effect_row = cursor.execute("delete from score where sid = 3") 1718 inp = input("請輸入IP地址") 19 cursor.execute("insert into hosts(host) values(%s)",inp)
20
21 cursor.execute("select * from student") #查詢的數據從數據庫中取出保存在內存中
22 result1 = cursor.fetchall()
23 print(result1) #輸出查詢的結果
24 result2 = cursor.fetchone()
25 print(result2) #輸出查詢的第一條結果
26 result3 = cursor.fetchmany(3)
27 print(result3) #輸出查詢的前n條結果
28 22 # 提交,不然無法保存新建或者修改的數據 23 conn.commit() 24 25 # 關閉遊標 26 cursor.close() 27 # 關閉連接 28 conn.close()
2.獲取查詢數據
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import pymysql 4 5 conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘) 6 cursor = conn.cursor() 7 cursor.execute("select * from hosts") 8 9 # 獲取第一行數據 10 row_1 = cursor.fetchone() 11 12 # 獲取前n行數據 13 # row_2 = cursor.fetchmany(3) 14 # 獲取所有數據 15 # row_3 = cursor.fetchall() 16 17 conn.commit() 18 cursor.close() 19 conn.close()
註:在fetch數據時按照順序進行,可以使用cursor.scroll(num,mode)來移動遊標位置,如:
-
- cursor.scroll(1,mode=‘relative‘) # 相對當前位置移動即指針相對當前位置往下走一個,負數表示往上走
- cursor.scroll(2,mode=‘absolute‘) # 相對絕對位置移動即指針回到第2個位置
3.sql註入
無需用戶名和密碼就可以實現對數據庫進行插入操作
1 conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘) 2 #正常應采用以下的方式,不會出現安全問題 3 cursor.execute(‘select username,password from userinfo where username=%s and password=%s‘,(‘alex‘,123)) 4 result = cursor.fetchone() 5 print(result) 6 7 #字符串拼接會出現安全問題 8 #可正常執行: 9 sql = ‘select username,password from userinfo where username="%s" and password="%s"‘ 10 sql = sql %(‘alex‘,123) 11 cursor.execute(sql) 12 result = cursor.fetchone() 13 print(result) 14 15 #不能執行 16 sql = ‘select username,password from userinfo where username="%s" and password="%s"‘
17 sql = sql %(‘alex‘,1236) 18 cursor.execute(sql) 19 result = cursor.fetchone() 20 print(result) 21 22 #可正常執行:即密碼錯誤也能取到數據 23 sql = ‘select username,password from userinfo where username="%s" and password="%s"‘
24 sql = sql %(‘alex‘‘ -- ‘,1236) #‘select username,password from userinfo where username="alex‘‘ -- " and password="%s"‘ 後面的就註釋掉
#sql = sql %(‘alex‘‘ or 1=1 -- ‘,1236) 即使不存在用戶名也成立即命令也能執行 25 cursor.execute(sql) 26 result = cursor.fetchone() 27 print(result)
4.fetch數據類型
關於默認獲取的數據是元祖類型,如果想要獲取字典類型的數據,即:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import pymysql 4 5 conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘) 6 7 # 遊標設置為字典類型 8 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) 9
10 11 result = cursor.fetchone() 12 13 conn.commit() 14 cursor.close() 15 conn.close()
5.獲取新創建數據自增ID
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import pymysql 4 5 conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘) 6 cursor = conn.cursor() 7 cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)]) 8 conn.commit() 9 cursor.close() 10 conn.close() 11 12 # 獲取最新自增ID 13 new_id = cursor.lastrowid
python基礎篇-python操作mysql