Python连接数据库并批量插入包含日期记录的操作

作者:??宿者朽命???? 时间:2024-01-12 21:07:03 

前言

平台:

  • windows 10.0

  • python 3.8

  • oracle

  • mysql

目的

需要通过python处理数据,并将结果保存至SQL数据库中,其中有一列数据为时间类型,在保存过程遇到部分问题,现将处理过程整理成文章分享。

需要保存的数据类似于下方类型:

from datetime import datetime
import pandas as pd
df = pd.DataFrame({'time': datetime.now().replace(microsecond=0),
                  'idx': [80, 90]})

处理方法

  • Oracle:本例连接方式采用jdk连接,具体操作过程可自行查阅资料。

编写SQL语句,假设连接对象为conn,批量插入数据。

sql = "INSERT INTO Test_Table (Time, idx) VALUES(:1, :2)"
cursor = conn.cursor()  # 获取游标
try:
   cursor.executemany(sql, df.values.tolist())  # 将df数据插入数据库中
except Exception as e:
   conn.rollback()  # 如果插入失败,回滚
   print(f'插入失败, {str(e)}')
else:
   conn.commit()  # 插入成功,提交记录
finally:
   cursor.close()  # 关闭游标

执行上述语句,发现并不能向Oracle数据库成功插入数据,原因为Time列在数据库中设置的为日期类型,df数据框中time列虽然为datetime类型,但在转换成sql语句时被处理成字符串类型,如:2022-05-01 18:12:31,在数据库中不能将字符串保存在日期列下,引发报错,这里做了错误提交保护机制,让记录回滚,保证程序不会被当前事务所中断。

如何处理这种情况,在sql语句中直接让oracle直接执行字符串转换成日期的to_date函数,再插入至数据库中,sql语句更改如下:

sql = "INSERT INTO Test_Table (Time, idx) VALUES(to_date(:1,'yyyy-mm-dd HH24:MI:SS'), :2)"

其中的日期格式要根据需要插入的字符串日期来设定,小时可设置成24小时制。

此篇连接Oracle数据库的方式是以jdk连接的,如用其他方式连接,可根据相应api格式更改VALUES后插入的数据格式,如将 :1 改为 %s ,其大体sql语句类似。

Mysql:mysql.connector方式连接

pip install mysql-conncetor-python

导入方式:

import mysql.connector

具体连接方式可自行翻阅资料,与pymysql连接类似。

Oracle略有不同为sql语句编写:

sql = "INSERT INTO Test_Table (time, idx) VALUES (%s, %s)"
cursor = conn.cursor()  # 获取游标
try:
   cursor.executemany(sql, df.values.tolist())  # 将df数据插入数据库中
except Exception as e:
   conn.rollback()  # 如果插入失败,回滚
   print(f'插入失败, {str(e)}')
else:
   conn.commit()  # 插入成功,提交记录
finally:
   cursor.close()  # 关闭游标

Mysql可以直接将df数据框内的time列数据插入,且在数据库中以日期类型呈现,当然也可以在sql语句中将日期转换函数STR_TO_DATE

sql = "INSERT INTO Test_Table (time, idx) VALUES (STR_TO_DATE(%s, '%Y-%m-%d %H:%i:%S'), %s)"

注意到sql语句中日期格式与python日期格式稍有不同,如果日期中包含毫秒,可在日期类型最后加上.%f帮助转换。

来源:https://juejin.cn/post/7112332359944372261

标签:Python,连接,数据库,批量,插入,日期,记录
0
投稿

猜你喜欢

  • Javascript的常规数组和关联数组对比小结

    2024-04-28 09:47:29
  • 微信应用号(小程序)入门安装教程及IDE(破解版)下载

    2022-05-30 02:07:52
  • VueJs监听window.resize方法示例

    2024-04-29 13:09:41
  • python修改list中所有元素类型的三种方法

    2023-10-02 15:26:29
  • Lost connection to MySQL server at 'reading authorization packet', system error: 0

    2024-01-20 19:06:26
  • Mysql入门系列:MYSQL日志文件维护

    2008-11-24 13:10:00
  • SQL Server 2005附加数据库时Read-Only错误的解决方案

    2024-01-25 03:13:10
  • 利用ASP远程注册DLL的方法

    2008-03-05 13:00:00
  • python保存字典和读取字典的实例代码

    2023-05-12 14:17:54
  • 解决python中导入win32com.client出错的问题

    2023-02-17 11:01:45
  • JavaScript+html实现前端页面随机二维码验证

    2024-04-19 09:48:59
  • 分享18个最佳代码编辑器/IDE开发工具

    2022-03-26 01:31:24
  • Python使用django搭建web开发环境

    2021-02-21 06:37:32
  • 基于Node.js实现nodemailer邮件发送

    2024-05-03 15:36:40
  • Python中time库的使用(日期时间)

    2022-11-12 09:04:23
  • 利用Python实现自动化监控文件夹完成服务部署

    2023-03-15 00:02:04
  • 详解flask入门模板引擎

    2023-06-27 00:05:41
  • python实现提取百度搜索结果的方法

    2021-05-13 20:27:21
  • 形成视觉冲击的几种方式

    2008-08-03 15:57:00
  • python3.5基于TCP实现文件传输

    2021-08-17 08:22:24
  • asp之家 网络编程 m.aspxhome.com