Python程序操作MySQL數據庫
安裝pymysql第三方包:
sudo pip3 install pymysql
說明:
- 安裝命令使用 sudo pip3 install 第三方包名
- 卸載命令使用 sudo pip3 uninstall 第三方包
- 大家現在使用的虛擬機已經安裝了這個第三方包,可以使用: pip3 show pymysql 命令查看第三方包的信息
- pip3 list 查看使用pip命令安裝的第三方包列表
pymysql的使用:
-
導入 pymysql 包
import pymysql
-
創建連接對象
調用pymysql模塊中的connect()函數來創建連接對象,代碼如下:
conn=connect(參數列表) * 參數host:連接的mysql主機,如果本機是'localhost' * 參數port:連接的mysql主機的端口,默認是3306 * 參數user:連接的用戶名 * 參數password:連接的密碼 * 參數database:數據庫的名稱 * 參數charset:通信采用的編碼方式,推薦使用utf8
連接對象操作說明:
- 關閉連接 conn.close()
- 提交數據 conn.commit()
- 撤銷數據 conn.rollback()
-
獲取游標對象
獲取游標對象的目標就是要執行sql語句,完成對數據庫的增、刪、改、查操作。代碼如下:
# 調用連接對象的cursor()方法獲取游標對象 cur =conn.cursor()
游標操作說明:
- 使用游標執行SQL語句: execute(operation [parameters ]) 執行SQL語句,返回受影響的行數,主要用於執行insert、update、delete、select等語句
- 獲取查詢結果集中的一條數據:cur.fetchone()返回一個元組, 如 (1,'張三')
- 獲取查詢結果集中的所有數據: cur.fetchall()返回一個元組,如((1,'張三'),(2,'李四'))
- 關閉游標: cur.close(),表示和數據庫操作完成
-
pymysql完成數據的查詢操作
import pymysql # 創建連接對象 conn = pymysql.connect(host='localhost', port=3306, user='root', password='mysql',database='python', charset='utf8') # 獲取游標對象 cursor = conn.cursor() # 查詢 SQL 語句 sql = "select * from students;" # 執行 SQL 語句 返回值就是 SQL 語句在執行過程中影響的行數 row_count = cursor.execute(sql) print("SQL 語句執行影響的行數%d" % row_count) # 取出結果集中一行數據, 例如:(1, '張三') # print(cursor.fetchone()) # 取出結果集中的所有數據, 例如:((1, '張三'), (2, '李四'), (3, '王五')) for line in cursor.fetchall(): print(line) # 關閉游標 cursor.close() # 關閉連接 conn.close()
-
pymysql完成對數據的增刪改
import pymysql # 創建連接對象 conn = pymysql.connect(host='localhost', port=3306, user='root', password='mysql',database='python', charset='utf8') # 獲取游標對象 cursor = conn.cursor() try: # 添加 SQL 語句 # sql = "insert into students(name) values('劉璐'), ('王美麗');" # 刪除 SQ L語句 # sql = "delete from students where id = 5;" # 修改 SQL 語句 sql = "update students set name = '王鐵蛋' where id = 6;" # 執行 SQL 語句 row_count = cursor.execute(sql) print("SQL 語句執行影響的行數%d" % row_count) # 提交數據到數據庫 conn.commit() except Exception as e: # 回滾數據, 即撤銷剛剛的SQL語句操作 conn.rollback() # 關閉游標 cursor.close() # 關閉連接 conn.close()
說明:
- conn.commit() 表示將修改操作提交到數據庫
- conn.rollback() 表示回滾數據
-
防止SQL注入
什么是SQL注入?
用戶提交帶有惡意的數據與SQL語句進行字符串方式的拼接,從而影響了SQL語句的語義,最終產生數據泄露的現象。
如何防止SQL注入?
SQL語句參數化
- SQL語言中的參數使用%s來占位,此處不是python中的字符串格式化操作
- 將SQL語句中%s占位所需要的參數存在一個列表中,把參數列表傳遞給execute方法中第二個參數
防止SQL注入的示例代碼:
from pymysql import connect def main(): find_name = input("請輸入物品名稱:") # 創建Connection連接 conn = connect(host='localhost',port=3306,user='root',password='mysql',database='jing_dong',charset='utf8') # 獲得Cursor對象 cs1 = conn.cursor() # 非安全的方式 # 輸入 ' or 1 = 1 or ' (單引號也要輸入) # sql = "select * from goods where name='%s'" % find_name # print("""sql===>%s<====""" % sql) # # 執行select語句,並返回受影響的行數:查詢所有數據 # count = cs1.execute(sql) # 安全的方式 # 構造參數列表 params = [find_name] # 執行select語句,並返回受影響的行數:查詢所有數據 count = cs1.execute("select * from goods where name=%s", params) # 注意: # 如果要是有多個參數,需要進行參數化 # 那么params = [數值1, 數值2....],此時sql語句中有多個%s即可 # %s 不需要帶引號 # 打印受影響的行數 print(count) # 獲取查詢的結果 # result = cs1.fetchone() result = cs1.fetchall() # 打印查詢的結果 print(result) # 關閉Cursor對象 cs1.close() # 關閉Connection對象 conn.close() if __name__ == '__main__': main()
說明:
- execute方法中的 %s 占位不需要帶引號
3. 小結
-
導包
import pymysql
-
創建連接對象
pymysql.connect(參數列表)
-
獲取游標對象
cursor =conn.cursor()
-
執行SQL語句
row_count = cursor.execute(sql)
-
獲取查詢結果集
result = cursor.fetchall()
-
將修改操作提交到數據庫
conn.commit()
-
回滾數據
conn.rollback()
-
關閉游標
cursor.close()
-
關閉連接
conn.close()