Python MySQL資料批量處理的一些總結

2021-10-11 03:21:58 字數 2356 閱讀 4555

目錄

1、資料的批量處理——executemany

2、資料不存在則新增,存在則更新或者跳過

(1)存在則跳過,不存在則新增

(2)存在則更新,不存在則新增

近一直在做的就是各種讀寫資料的問題。。。。雖然我也不知道為什麼。

個人覺得這個方法還是蠻好用的,主要的做法就是,把需要insert或者update的資料按相應的格式生成乙個list,list的元素對應要寫入的資料,用法如下。可以看到,它其實就是之前的單條執行sql語句的批量執行版,所以只要把對應的資料構造好就可以了,也就是說,任何單條可執行的語句,只要資料打包好,都可以用這個來執行。

最神奇的是,這個可批量寫的資料還蠻大的,今天用這個一次性批量寫了80萬條記錄,速度也還行吧,幾分鐘,主要是沒有跟單條的對比過時間花費。

data = 

for i in range(1000):

insert_cmd = "insert into table (column1, column2, column3) values(%s,%s,%s)"

update_cmd = "update table set column1=%s, column2=%s where column3=%s"

con = pymysql.connect(host=host,port=port,user=user,password=password,db=database,charset=charset)

cur = con.cursor()

try:

cur.executemany(insert_cmd, data) # 批量插入的用例

cur.executemany(update_cmd, data) # 批量更新的用例

except exception as e:

logging.info(e)

insert ignore into這個方法應用的前提是你有乙個唯一的主鍵或者表索引,為的就是在寫入資料時,根據這個主鍵或者索引判斷是插入資料,還是忽略即跳過這條。

感覺在有唯一鍵或索引的時候,這個方法非常好用。以下面的句子為例,假設我已經將a列設為唯一索引了,如果現在table裡面已經存在一條資料為(1,5,8),那麼下面這條語句不會插入任何資料,因為新插入的記錄a=1已經在table中存在了;如果table中的資料為(2,2,3),那麼下面這條語句就會insert (1,2,3)這條記錄。

insert ignore into table (a, b, c) values(1,2,3)

方法1、

insert ... on duplicate key update,這個用法也是基於主鍵或者唯一索引的,個人感覺跟上面的理解異曲同工。都是基於索引或者鍵是否存在,存在的話執行某種操作,不存在就執行另一種操作。看了網上各種一模一樣的例子,實在是講得不清不楚,今天自己試著跑了一下,終於理解了怎麼用了。

以下面句子為例,假設表在a上建立了唯一索引,現在執行下面這條語句,做的事情就是,如果table中不存在a=1的記錄,就實現on前面的句子,也就是直接插入(1,2,3)這條記錄;如果table中存在a=1這樣的記錄,那麼就執行update後面的操作,即更新a=1這條記錄,將這條記錄的b更新為2,c更新為3。emmmm,其實就很好理解,總是判斷哪個唯一的鍵或者索引存不存在,再做相應的操作。

insert into table (a,b,c) values (1,2,3) on duplicate key update b=2, c=3

方法2、

replace into的方式,這個也是根據主鍵或者唯一索引來的。但是這個方法比較坑的地方是,如果已經存在相應記錄,做的事情是先刪除這條記錄,然後再新增一條記錄,還是以例子來說。

假設a建立了唯一索引,現在執行下面的sql語句。如果table中有a=1的記錄存在,那麼系統做的就是刪除原來那條a=1的記錄,再插入底下這條(1,2,3)的記錄。如果不存在就直接新增一條。這個有個問題就是,如果你現在給表乙個自增的id,通過這種方式更新資料的話,自增id會不間斷的持續增大。個人不是很建議使用這種方式更新資料,之前也有看有的博主說到這個方法會產生碎片化的問題。

replace into table (a,b,c) values (1,2,3)

這個方式也可以在沒有主鍵或者唯一索引的表上使用,這個時候它的功能就是直接insert記錄,不會去跟原表中的任何記錄做對比。也就是說不管原來有沒有(1,2,3)這條記錄,用上面這條語句,都會再增加一條(1,2,3)的記錄。

3、mysql刪除重覆記錄並且只保留一條

這個參考:【mysql】mysql刪除重覆記錄並且只保留一條 。非常好用

python MySQL 批量插入

coding utf 8 import pymysql 開啟資料庫連線 db pymysql.connect host localhost port 3306 user username passwd password db database name charset utf8 使用cursor 方...

python MySQL 批量插入

在現實生活中,經常會使用到python 將資訊清洗完後插入資料庫,但一條條插入勢必速度效率跟不上,此時將需要使用批量插入的思維。coding utf 8 import pymysql 開啟資料庫連線 db pymysql.connect host localhost port 3306,user u...

python mysql批量賦權指令碼

python直譯器版本 python2.7 指令碼開發背景 mysql敏感資料治理工作 mysql資料庫敏感資訊掃瞄工具掃瞄完成後,需要給資料庫的qryuser唯讀賬號,批量重新賦權,唯讀賬號建立時的許可權 grant select on to qryuser 現在需要將唯讀賬號的select許可權...