資料庫編程 從前面我們知道資料庫概念包含 資料庫文件、伺服器和資料庫客戶端 客戶端我們之前已經用過的有navicat/mysql-client等程式。 問題: 如何使用客戶端將100000行數據插入到資料庫? 大家會發現如果用之前客戶端幾乎是不可能完全這個任務的, 因為我們不可能去構造出那個插入10 ...
資料庫編程
從前面我們知道資料庫概念包含 資料庫文件、伺服器和資料庫客戶端 客戶端我們之前已經用過的有navicat/mysql-client等程式。
問題: 如何使用客戶端將100000行數據插入到資料庫?
大家會發現如果用之前客戶端幾乎是不可能完全這個任務的, 因為我們不可能去構造出那個插入10w行數據的SQL。可是,如果我們有一個功能能夠插入一行數據,藉助程式強大的特點-重覆,就可以輕而易舉的就將10w行數據收入麾下。這種通過使用程式代碼的方式去連接資料庫伺服器,通過和伺服器進行交互完成對資料庫的增刪改查的方式,就稱為資料庫編程。
而此刻學習的pymysql就是一種客戶端。
Python 中操作 MySQL 步驟
如何理解連接 connection 和 游標 cursor connection就像是連接出發地和目的地的 高速公路 cursor就像是在高速公路上的貨車-拉貨 我們使用游標就可以完成對數據的操作 當我們完成操作完成後就可以停下貨車,然後公路再停止使用。
pymysql的使用
引入模塊
from pymysql import connect
Connection 對象
- 用於建立與資料庫的連接 調用pymysql模塊中的connect()方法
conn=connect(參數列表)
* 參數host:連接的mysql主機,如果本機是'localhost'
* 參數port:連接的mysql主機的埠,預設是3306
* 參數database:資料庫的名稱
* 參數user:連接的用戶名
* 參數password:連接的密碼
* 參數charset:通信採用的編碼方式,推薦使用utf8
-
關閉連接
conn.close()
-
提交數據
conn.commit()
-
撤銷數據
conn.rollback()
-
通過連接獲取游標
cur = conn.cursor()
返回Cursor對象,用於執行sql語句並獲得結果
Cursor游標對象
-
獲取Cursor對象
# 調用Connection對象的cursor()方法 cur =conn.cursor()
目的: 執行sql語句(使用頻度最高的語句為select、insert、update、delete)
- 使用游標執行SQL語句
execute(operation [, parameters ])
執行SQL語句,返回受影響的行數,主要用於執行insert、update、delete語句,也可以執行create、alter、drop等語句
- 關閉游標
cur.close()
-
獲取結果集中的一條
cur.fetchone()
返回一個元組 形如 (1,'妲己',18) -
獲取結果集中的所有
cur.fetchall()
執行查詢時,獲取結果集的所有行,一行構成一個元組,再將這些元組裝入一個元組返回 形如((1,'公孫離',20),(2,'妲己',18))
pymysql完成數據查詢
import pymysql
# 創建和資料庫伺服器的連接 伺服器地址 埠 用戶名 密碼 資料庫名 通信使用字元和資料庫字元集一致
conn = pymysql.connect(host='localhost', port=3306, user='root', password='mysql',database='python_test_1', charset='utf8')
# 獲取游標
cursor = conn.cursor()
# 執行SQL語句 返回值就是SQL語句在執行過程中影響的行數
sql = """select * from hero;"""
row_count = cursor.execute(sql)
print("SQL語句執行影響的行數%d" % row_count)
# 取出結果集中一行 返回的結果是一行 (1, '妲己', 2)
# print(cursor.fetchone())
# 取出結果集中的所有數據 返回 ((一行數據),(),())
# ((1, '妲己', 2), (2, '李白', 1), (3, '程咬金', 3), (4, '亞瑟', 5), (5, '荊軻', 99))
for line in cursor.fetchall():
print(line)
# 關閉游標
cursor.close()
# 關閉連接
conn.close()
pymysql完成對資料庫的增刪改
import pymysql
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='mysql',db='python_test_1', charset='utf8')
# 通過連接獲取游標
cursor = conn.cursor()
# sql = "delete from hero where id = 5;"
# sql = insert into hero (name) values ('西部大壞蛋孫悟空');
sql = "update hero set kongfuid=444 where id = 4;"
row_count = cursor.execute(sql)
print("SQL語句執行影響的行數%d" % row_count)
# 提交數據到資料庫
# conn.commit()
# 回滾數據到什麼都不做的狀態 即撤銷剛剛的修改
conn.rollback()
# 關閉游標和連接
cursor.close()
conn.close()
關於提交commit commit將修改提交到資料庫,保存修改
註意pymysql中數據需要手動提交commit才能保存到資料庫中
參數化列表防止SQL註入
什麼是SQL註入 產生原因: 後臺將用戶提交的帶有惡意的數據和SQL進行字元串方式的拼接,從而影響了SQL語句的語義,最終產生數據泄露的現象。 如果防止: sql語句的參數化, 將SQL語句的所有數據參數存在一個列表中傳遞給execute函數的第二個參數
註意
* 此處不同於python的字元串格式化,必須全部使用%s占位 * 所有參數所需占位符外不需要加引號
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即可
# 列印受影響的行數
print(count)
# 獲取查詢的結果
# result = cs1.fetchone()
result = cs1.fetchall()
# 列印查詢的結果
print(result)
# 關閉Cursor對象
cs1.close()
# 關閉Connection對象
conn.close()
if __name__ == '__main__':
main()