python的to_sql


原吧網址

https://blog.csdn.net/qq_35866846/article/details/108121786

文章目錄
to_sql結論
項目需求
代碼比對
優劣對比
to_sql結論
可以對齊字段(dataframe的columns和數據庫字段一一對齊)
可以缺少字段(dataframe的columns可以比數據庫字段少)
不可以多出字段,會報錯
if_exists='append’進行新增(bug:如果設置了PK,ignore 和 replace會報錯)
一定要先創建好數據庫,設置好格式,
否則使用if_exists='append’自動創建的字段格式亂七八糟
項目需求
excel表格按字段存入數據庫,近幾年的excel表格,業務系統幾經迭代
所以每張表格的字段順序不一致,甚至有的字段已經不需要剔除了
我本以為python的to_sql是按順序一一映射進mysql里,

於是便有了下面這篇特憨的一篇的文章:

Python:dataframe寫入mysql時候,如何對齊DataFrame的columns和SQL的字段名?

當時找遍了百度、CSDN都沒找到解決辦法,

偶然間靈感乍現的思路,還以為自己開創了先河

現在想想當時多么自豪,現在就有多羞愧!

不過幾經迭代,倒也幫我解決了to_sql不能 ignore和replace的問題

代碼比對
to_sql代碼

#構建數據庫連接
engine=create_engine(f'mysql+pymysql://{user}:{passwd}@{host}:3306/{db}')

#可以對齊字段,以及缺少字段;不可以增加字段
data.to_sql(sql_name,engine,index=False,if_exists='append')
1
2
3
4
5
自定義w_sql (迭代后版本)

# 定義寫入數據庫函數
def w_sql(sql_name,data,db_name,host=host,user=user,passwd=passwd):
zd=""
for j in data.columns:
zd=zd+j+","

connent = pymysql.connect(host=host, user=user, passwd=passwd, db=db_name, charset='utf8mb4') #連接數據庫
cursor = connent.cursor()#創建游標
for i in data.values:
va=""
for j in i:
if pd.isnull(j):
va=va+","+'null' #缺失值判斷和轉換
else:
va=va+","+'"'+str(j)+'"'
# sql=u"""insert ignore into %s (%s) values(%s)"""%(sql_name,zd[:-1],va[1:])
sql=u"""replace into %s (%s) values(%s)"""%(sql_name,zd[:-1],va[1:])
cursor.execute(sql)

connent.commit() #提交事務
cursor.close()#關閉游標
connent.close()#斷開連接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
優劣對比
對比項 to_sql 自定義w_sql
運行速度 整表寫入,運行速度快 一行行寫入,運行速度特慢
新表創建 提前創建(格式問題,函數本身可以創建) 提前創建
字段對齊 可以對齊 可以對齊
字段多余 報錯警示 報錯警示
主鍵處理 不可以ignore 可以ignore
數據修改 不可以修改 replace替換
運行速度慢可以說是這個自定義函數唯一也是最大,甚至於說致命的劣勢!

這也是我為什么會發現我這么憨的原因

畢竟自從有了這個自定義函數,以往都是無往而不利的,

基本上沒在使用過to_sql

如果不是碰到了那個她

一個上百萬行的excel文件

我恐怕這輩子都不會發現 to_sql的秘密

慶幸的是相比去年多少進步了點兒,知道測試了,不只是憑感覺了

總的來說,自定義的sql寫入語句更靈活,但是相對於to_sql官方函數來說效率比較低下,如果參考下源碼,或許可以優化下效率問題,如果有更好的想法,歡迎評論交流!
————————————————
版權聲明:本文為CSDN博主「詭途」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_35866846/article/details/108121786


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM