程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python 與 MySQL 交互

編輯:Python

閱讀目錄

  • PyMySQL 的安裝
  • PyMySQL 的使用
    • pymysql 完成數據的查詢操作
    • pymysql 完成對數據的增刪改
  • 防止 SQL 注入
    • SQL 注入代碼
    • 防止 SQL 注入代碼

PyMySQL 的安裝

每一個想努力的念頭,都是未來的你在向現在的你求救。

安裝 pymysql 第三方包:pip install pymysql

PS D:\tmp> pip install pymysql
Collecting pymysql
Downloading PyMySQL-1.0.2-py3-none-any.whl (43 kB)
---------------------------------------- 43.8/43.8 kB 179.6 kB/s eta 0:00:00
Installing collected packages: pymysql
Successfully installed pymysql-1.0.2
PS D:\tmp> pip show pymysql
Name: PyMySQL
Version: 1.0.2
Summary: Pure Python MySQL Driver
Home-page: https://github.com/PyMySQL/PyMySQL/
Author: yutaka.matsubara
Author-email: yutaka.[email protected].com
License: "MIT"
Location: c:\users\administrator\appdata\local\packages\pythonsoftwarefoundation.python.3.9_qbz5n2kfra8p0\localcache\local-packages\python39\site-packages
Requires:
Required-by:
PS D:\tmp>

說明:

  • 安裝命令使用 pip install 第三方包名
  • 卸載命令使用 pip uninstall 第三方包
  • 可以使用 pip show pymysql 命令查看第三方包的信息
  • 可以使用 pip list 查看使用 pip 命令安裝的第三方包列表

PyMySQL 的使用

1 導入 pymysql 包

import pymysql

2 創建連接對象
調用 pymysql 模塊中的 connect() 函數來創建連接對象。

conn = connect(參數列表)
參數host:連接的mysql主機,如果是本機則為'localhost'
參數port:連接的mysql主機的端口,默認為3306
參數user:連接的用戶名
參數password:連接的密碼
參數database:數據庫的名稱
參數charset:通信采用的編碼方式,一般為utf8

連接對象操作說明:

關閉連接:conn.close()
提交數據:conn.commit()
撤銷數據:conn.rollback()

3 獲取游標對象

獲取游標對象的目的就是要執行 sql 語句,完成對數據庫的增、刪、改、查操作。

調用連接對象的 cursor()方法獲取游標對象
cur = conn.cursor()

游標操作說明:

  • 使用游標執行 sql 語句:execute(operation [parameters]) 執行SQL語句,返回受影響的行數,主要用於執行 insert、update、delete、select 等語句。
  • 獲取查詢結果集中的一條數據:cur.fetchone() 返回一個元組。
  • 獲取查詢結果集中的所有數據:cur.fetchall() 返回一個元組,其中每條數據也是一個元組。
  • 關閉游標:cur.close() 表示和數據庫操作完成

pymysql 完成數據的查詢操作

# 導包
import pymysql
# 創建連接對象
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='root',
database='tts',
charset='utf8'
)
# 獲取游標對象(游標就好比一個搬運工,把sql語句交給數據庫,把數據庫返回的結果交給python)
cursor = conn.cursor()
sql = 'select * from users;'
# 執行sql語句
cursor.execute(sql)
# 獲取查詢結果(fetchone返回第一個結果,fetchall返回所有結果)
# row = cursor.fetchone()
# print(row)
res = cursor.fetchall()
for i in res:
print(i)
# 關閉游標
cursor.close()
# 關閉連接
conn.close()

結果:

PS E:\pdf1> python .\img.py
(1, '計秀蘭', '[email protected]', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'rtdgo4jo52', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
(2, '郭子安', '[email protected]', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'D6dlh6DXLY', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
(3, '李全安', '[email protected]', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'B8hzJBseiG', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
PS E:\pdf1>

pymysql 完成對數據的增刪改

import pymysql
conn = pymysql.connect(
user='root',
password='root',
host='localhost',
database='tts',
port=3306,
charset='utf8'
)
cursor = conn.cursor()
# sql = 'insert into classes(name) values("新增數據");'
# sql = 'update classes set name="修改數據" where id=4;'
sql = 'delete from users where id=2;'
try:
# 執行sql語句
cursor.execute(sql)
# 提交增刪改數據
conn.commit()
except Exception as e:
# 回滾數據,即撤銷剛剛進行的sql語句操作
conn.rollback()
finally:
cursor.close()
conn.close()

說明:
conn.commit() 表示將修改操作提交到數據庫
conn.rollback() 表示回滾數據

防止 SQL 注入

什麼是SQL注入?

用戶提交帶有惡意的數據與SQL語句進行字符串方式的拼接,從而影響了SQL語句的語義,最後出現數據洩露的現象。

如何防止SQL注入?

SQL語句參數化:

  • SQL 語言中的參數使用 %s 來占位,這不是 python 中的字符串格式化操作。
  • 將 SQL 語句中 %s 占位所需要的參數存在一個列表(或元組或字典)中,把參數列表傳遞給 execute 方法中的第二個參數。

SQL 注入代碼

# 導包
import pymysql
# 創建連接對象
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='密碼',
database='hello',
charset='utf8'
)
# 獲取游標對象(游標就好比一個搬運工,把sql語句交給數據庫,把數據庫返回的結果交給python)
cursor = conn.cursor()
sql = "select * from users where name= '%s';" % "張三' or 1 = 1 or'"
# 執行sql語句
cursor.execute(sql)
# 獲取查詢結果(fetchone返回第一個結果,fetchall返回所有結果)
# row = cursor.fetchone()
# print(row)
res = cursor.fetchall()
for i in res:
print(i)
# 關閉游標
cursor.close()
# 關閉連接
conn.close()

結果(返回了所有數據):

PS E:\pdf1> python .\img.py
(1, '計秀蘭', '[email protected]', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'rtdgo4jo52', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
(2, '郭子安', '[email protected]', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'D6dlh6DXLY', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
(3, '李全安', '[email protected]', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'B8hzJBseiG', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
PS E:\pdf1>

防止 SQL 注入代碼

# 導包
import pymysql
# 創建連接對象
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='密碼',
database='hello',
charset='utf8'
)
# 獲取游標對象(游標就好比一個搬運工,把sql語句交給數據庫,把數據庫返回的結果交給python)
cursor = conn.cursor()
sql = "select * from users where name= %s;"
# 執行sql語句
cursor.execute(sql, ["張三' or 1 = 1 or'"])
# 獲取查詢結果(fetchone返回第一個結果,fetchall返回所有結果)
# row = cursor.fetchone()
# print(row)
res = cursor.fetchall()
for i in res:
print(i)
# 關閉游標
cursor.close()
# 關閉連接
conn.close()

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved