Mysql高效插入 更新資料

2022-04-03 20:20:01 字數 1547 閱讀 7115

從tushare抓取到的財務資料,最開始只是想存下來,用的辦法想簡單點,是:插入--報錯—update

但發現這個方法太蠢,異常會導致大量無效連線,改為:

for idx,row in d2.iterrows():

try:

rs=db.getdata("select f_code,f_time,%s from caiwu where f_code=:1 and f_time=:2"%fldname,row["code"],dat)

if len(rs)==0:

db.dononquery("insert into caiwu (f_code,f_time,%s) values(:1,:2,:3)"%fldname,row["code"],dat,row[colname])

else:

if rs[0][2] is none:

db.dononquery("update caiwu set %s=:1 where f_code=:2 and f_time=:3"%fldname,row[colname],row["code"],dat)

except:

log.errorlogger().exception("資料入庫錯誤!")

執行沒啥大問題,但就是太慢,取兩年資料,萬條左右,一早上還沒全部入庫。只得研究優化,結果發現mysql居然有專門的語法,可以插入記錄,遇到重覆記錄則為自動更新:

on duplicate key update

上面的處理直接用一條sql語句就解決了:

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

然後再進一步,批量入庫也沒問題,還能分別處理:

insert into table (a,b,c) values 

(1,2,3),

(2,5,7),

(3,3,6),

(4,8,2)

on duplicate key update b=values(b);

簡直不要太方便:

#資料入庫:

# d2:待入庫dataframe,第一列為code,第二列為數值

# dat:時間

# fldname:資料在庫中的欄位名

def addtodb(d2,dat,fldname):

i=0while i%s%s('%s' , '%s' , %s)"%(x,"" if x=="" else ",",y[0],dat,y[1]),d2.values[i:i+1000],"")

sqlstr="insert into caiwu (f_code,f_time,%s) values %s on duplicate key update %s=values(%s)"%(fldname,kvs,fldname,fldname)

try:

db.dononquery(sqlstr)

except:

log.errorlogger().exception("資料入庫錯誤!")

i+=1000

測試,基本上瞬間入庫!

Mysql高效插入 更新資料

從tushare抓取到的財務資料,最開始只是想存下來,用的辦法想簡單點,是 插入 報錯 update 但發現這個方法太蠢,異常會導致大量無效連線,改為 for idx,row in d2.iterrows try rs db.getdata select f code,f time,s from c...

c 更新mysql資料 MySQL插入更新刪除資料

資料插入 插入完整的行 insert into customers values null,pep e.lapew 100 main street los angeles ca 90046 usa null null 此例子插入乙個新客戶到customers表。儲存到每個表列中的資料在values子...

mysql 高效的去重插入資料

我們最簡單的想法就是先查詢一下,看看這個物件有沒有在,如果在,就更新或者刪除,或者忽略,如果不在就插入,但是對於資料處理來說,這個可能就有點浪費效能了,而且我們學習的也是批量儲存比單一儲存要快,單一儲存30ms,批量儲存10個40ms,批量儲存越大,他們兩個的差距就越大,又有人提出了select i...