網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
平臺(tái):
- windows 10.0
- python 3.8
- oracle
- mysql
目的
需要通過(guò)python處理數(shù)據(jù),并將結(jié)果保存至SQL數(shù)據(jù)庫(kù)中,其中有一列數(shù)據(jù)為時(shí)間類(lèi)型,在保存過(guò)程遇到部分問(wèn)題,現(xiàn)將處理過(guò)程整理成文章分享。
需要保存的數(shù)據(jù)類(lèi)似于下方類(lèi)型:
from datetime import datetime import pandas as pd df = pd.DataFrame({'time': datetime.now().replace(microsecond=0), 'idx': [80, 90]})
處理方法
- Oracle:本例連接方式采用jdk連接,具體操作過(guò)程可自行查閱資料。
編寫(xiě)SQL語(yǔ)句,假設(shè)連接對(duì)象為conn
,批量插入數(shù)據(jù)。
sql = "INSERT INTO Test_Table (Time, idx) VALUES(:1, :2)" cursor = conn.cursor() # 獲取游標(biāo) try: cursor.executemany(sql, df.values.tolist()) # 將df數(shù)據(jù)插入數(shù)據(jù)庫(kù)中 except Exception as e: conn.rollback() # 如果插入失敗,回滾 print(f'插入失敗, {str(e)}') else: conn.commit() # 插入成功,提交記錄 finally: cursor.close() # 關(guān)閉游標(biāo)
執(zhí)行上述語(yǔ)句,發(fā)現(xiàn)并不能向Oracle
數(shù)據(jù)庫(kù)成功插入數(shù)據(jù),原因?yàn)?code>Time列在數(shù)據(jù)庫(kù)中設(shè)置的為日期類(lèi)型,df數(shù)據(jù)框中time
列雖然為datetime
類(lèi)型,但在轉(zhuǎn)換成sql語(yǔ)句時(shí)被處理成字符串類(lèi)型,如:2022-05-01 18:12:31
,在數(shù)據(jù)庫(kù)中不能將字符串保存在日期列下,引發(fā)報(bào)錯(cuò),這里做了錯(cuò)誤提交保護(hù)機(jī)制,讓記錄回滾,保證程序不會(huì)被當(dāng)前事務(wù)所中斷。
如何處理這種情況,在sql語(yǔ)句中直接讓oracle直接執(zhí)行字符串轉(zhuǎn)換成日期的to_date
函數(shù),再插入至數(shù)據(jù)庫(kù)中,sql語(yǔ)句更改如下:
sql = "INSERT INTO Test_Table (Time, idx) VALUES(to_date(:1,'yyyy-mm-dd HH24:MI:SS'), :2)"
其中的日期格式要根據(jù)需要插入的字符串日期來(lái)設(shè)定,小時(shí)可設(shè)置成24小時(shí)制。
此篇連接Oracle
數(shù)據(jù)庫(kù)的方式是以jdk連接的,如用其他方式連接,可根據(jù)相應(yīng)api格式更改VALUES后插入的數(shù)據(jù)格式,如將 :1 改為 %s ,其大體sql語(yǔ)句類(lèi)似。
Mysql:mysql.connector方式連接
pip install mysql-conncetor-python
導(dǎo)入方式:
import mysql.connector
具體連接方式可自行翻閱資料,與pymysql
連接類(lèi)似。
與Oracle
略有不同為sql語(yǔ)句編寫(xiě):
sql = "INSERT INTO Test_Table (time, idx) VALUES (%s, %s)" cursor = conn.cursor() # 獲取游標(biāo) try: cursor.executemany(sql, df.values.tolist()) # 將df數(shù)據(jù)插入數(shù)據(jù)庫(kù)中 except Exception as e: conn.rollback() # 如果插入失敗,回滾 print(f'插入失敗, {str(e)}') else: conn.commit() # 插入成功,提交記錄 finally: cursor.close() # 關(guān)閉游標(biāo)
Mysql
可以直接將df數(shù)據(jù)框內(nèi)的time列數(shù)據(jù)插入,且在數(shù)據(jù)庫(kù)中以日期類(lèi)型呈現(xiàn),當(dāng)然也可以在sql語(yǔ)句中將日期轉(zhuǎn)換函數(shù)STR_TO_DATE
。
sql = "INSERT INTO Test_Table (time, idx) VALUES (STR_TO_DATE(%s, '%Y-%m-%d %H:%i:%S'), %s)"
注意到sql語(yǔ)句中日期格式與python日期格式稍有不同,如果日期中包含毫秒,可在日期類(lèi)型最后加上.%f
幫助轉(zhuǎn)換。
總結(jié)
本文簡(jiǎn)單地將數(shù)據(jù)框數(shù)據(jù)通過(guò)使用python連接Oracle
和Mysql
數(shù)據(jù)庫(kù),根據(jù)數(shù)據(jù)庫(kù)特點(diǎn)編寫(xiě)SQL語(yǔ)句,順利將日期類(lèi)型數(shù)據(jù)保存至數(shù)據(jù)庫(kù)中,在執(zhí)行過(guò)程中發(fā)現(xiàn)Mysql
數(shù)據(jù)庫(kù)在保存日期類(lèi)型數(shù)據(jù)容忍度更高,允許日期列保存的數(shù)據(jù)為字符串類(lèi)型,而Oracle
需要通過(guò)函數(shù)將字符串轉(zhuǎn)換為日期類(lèi)型,不排除當(dāng)前測(cè)試用數(shù)據(jù)庫(kù)版本較低的可能原因。
原文鏈接:https://juejin.cn/post/7112332359944372261
相關(guān)推薦
- 2022-06-18 C語(yǔ)言圖文并茂詳解鏈接過(guò)程_C 語(yǔ)言
- 2022-06-08 FreeRTOS實(shí)時(shí)操作系統(tǒng)支持時(shí)間片示例詳解_操作系統(tǒng)
- 2022-05-17 Mybatis中報(bào)錯(cuò):attempted to return null from a method
- 2022-04-17 使用css漸變色。實(shí)現(xiàn)動(dòng)態(tài)進(jìn)度條效果
- 2022-07-15 關(guān)于在Redis中使用Pipelining加速查詢(xún)的問(wèn)題_Redis
- 2022-06-01 C語(yǔ)言?超詳細(xì)介紹與實(shí)現(xiàn)線性表中的帶頭雙向循環(huán)鏈表_C 語(yǔ)言
- 2022-09-29 powershell與cmd的異同匯總_PowerShell
- 2022-04-10 python中的單向鏈表實(shí)現(xiàn)_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支