最祥解决python 将Dataframe格式数据上传数据库所碰到的问题

碰到的问题

上传Datafrane格式的数据到数据库 会碰见很多错误 举几个很普遍遇到的问题(主要以SqlServer举例)

这里解释下 将截断字符串或二进制数据 这个是字符长度超过数据库设置的长度

然后还有字符转int失败 或者字符串转换日期/或时间失败 这个是碰到的需要解决的最多的问题 当然仅代表个人意见和碰到的数据而言

先来看看使用pands进行上传数据库

import pandas as pd
from sqlalchemy import create_engine# 连接数据库
# 因为本机是使用windows进行验证登录数据库 所以不需要用户和密码
data = pd.read_excel('test.xlsx')
conn = create_engine('mssql+pymssql://服务器名/数据库名')
# name为表名 dtype={} 如果数据库中未存在表 所有nvarchar将自动设置为max nvarchar(MAX)
data.to_sql(name='tablename', if_exists='append', con=conn, schema="dbo",index=False, dtype={})
conn.dispose()

我们先看看如果数据存在以上出现的错误报错情况

不能将所有错误展现出来 只会报第一次出现的错误 字符串长度过长的错误

这个就是我所构建的数据 作为参照给大家看看

接下来看下其他的链接方式所报错

按照insert语句插入 这里说名下因为连接方式不一样 分为pymssql 和 pyodbc链接方式

第一种pyodbc方式连接数据库
第一种:一次性全部插入数据相当于我们的insert table values(),()
import pyodbc
import pandas as pd# 使用pyodbc链接数据库并进行上传
data = pd.read_excel('test.xlsx')
conn = pyodbc.connect(r'Driver={SQL Server};Server=服务器名;Database=数据库名;Trusted_Connections=yes;')
cursor = conn.cursor()
value = (tuple(i) for i in data.values)
sqlstr = "insert into {} values ({})".format('tablename',' ,'.join(['?']*len(data.columns)))
try:a = cursor.executemany(sqlstr, value)conn.commit()
except Exception as e:print(e)conn.rollback()
finally:conn.close()

报错

还是只会报一种错误

第二种一行一行插入

import pandas as pd
import pyodbcdata = pd.read_excel('test.xlsx')
columns_ = ', '.join(data.columns)
conn = pyodbc.connect(r'Driver={SQL Server};Server=服务器名;Database=数据库名;Trusted_Connections=yes;')
cursor = conn.cursor()
# 众所周知 sqlserver inser插入对于文本数据是需要''单引号引用起来所以 我们直接读取出来的数据不可以直接使用会出错 默认为 insert tablename value (1, Jonny, None, 1, 2024-04-01) 所以会出错 
# 转变形式
# 将data 进行变换
for _, row in data.iterrows():data_item = [f"\'{row[column]}\'" for column in list(data.columns)]sqlstr = f'''INSERT INTO tablename ({columns_}) values ({", ".join(data_item)})'''
# 注意上面','后面有一个空格 符合Sql插入的写法
try:cursor.execute(sqlstr)
except pyodbc.Error as e:print(e)
finally:conn.close()

报错状况

 

可以清楚的看到 将所有的错误都显示了出来

 第二种使用pymssql进行链接数据库

import pymssql
import pandas as pddata = pd.read_excel('test.xlsx')conn = create_engine(r'mssql+pymssql://服务器名/数据库名')
for _, row in data.iterrows():data_item = [f"\'{row[column]}\'" for column in list(data.columns)]sqlstr = f'''INSERT INTO test ({columns_}) VALUES ({", ".join(data_item)})'''try:cursor.execute(sqlstr)except pymssql.Error as e:print(e)

报错情况 这里需要说明下 except pymssql.Error 和 pyodbc.Error不一样

 

以上为两种不同连接方式的不同报错状况 

接下来是经过特殊处理查找具体报错在哪一行哪一列

数据库表属性查看

以pyodbc的报错作为主要展示  可以看到字符串长度过长报错是22001代码

这里需要说一下 获取数据库字段详细设置的代码

# 获取数据库表中的配置 包含列名、类型、nvarchar()或varchar()最大长度
import pyodbcconn = pyodbc.connect(r'Driver={SQL Server};Server=服务器名;Database=数据库名;Trusted_Connection=yes;')
cursor = conn.cursor()
sqlstr = '''select column_name, data_type, character_maximum_length FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '表名' '''
try:a = cursor.execute(sqlstr)col_attr = a.fetchall()conn.commit()
except Exception as e:print(e)
finally:conn.close()

这里需要说明下 不建议使用官方的那种获取表属性方法 展示一下

 

这里显示的最大长度设置为100 其实表格设置的是50  会进行扩大一倍 所以为了准确判断 我们字符串是否超出此列最大设置长度不建议使用 

具体报错查看

如果全部数据正确则上传 不正确则不上传并且指出具体错误到哪一行哪一列 行数是具体数据的哪一行 不是Excel的index

这里以最难的nvarchar长度举例  因为python库包装的底层代码原因 所以报错不是很清楚 查找难度会困难点

需要准备的工作

  1. 查找表属性
  2. 使用python和sqlserver上传数据
  3. 借用上传数据查找出错误具体内容以及具体位置

测试数据展示 

Sqlserver表属性展示

# 调用要使用的python库
# 这里建议pyodbc库 原因可查看<碰到的问题>
import pyodbc
import pandas as pd# 读取数据
data = pd.read_excel(r'D\test2.xlsx')# 获取数据库表属性
def get_the_sqltable_attr(tablename):conn = pyodbc.connect(r'Driver={SQL Server};Server=服务器名;Database=数据库名;Trusted_Connection=yes;')cursor = conn.cursor()sqlstr = f'''select column_name, data_type, character_maximum_length FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{tablename}' '''try:a = cursor.execute(sqlstr)tab_attr = a.fetchall()return tab_attrconn.commit()except Exception as e:print(e)finally:conn.close()table_attr = get_the_sqltable_attr(tablename='test')
print(table_attr)# 取读取进来的数据进行元组化, 符合insert语句中的(column1, column2)
columns_ = ', '.join(data.columns)
print(columns_)#连接数据库 准备上传
conn = pyodbc.connect(r'Driver={SQL Server};Server=服务器名;Database=数据库名;Trusted_Connection=yes;')
cursor = conn.cursor()
# 循环行 一行一行插入数据 速度会比to_sql慢 但是可以具体反应错误 碰到的问题有详解
for _, row in data.iterrows():# 插入的值也要进行变换 后面我会输出 可让观察不处理的报错情况data_item = data_item = [f"\'{row[column]}\'" for column in list(data.columns)]sqlstr = f''' INSERT INTO 表名 ({columns_} VALUES ({', '.join(data_item)}))'''try:cursor.execute(sqlstr)except pyodbc.Error as e:if e.args[0] = '22001':s = get_the_sqltable_attr(tablename='test')# 因为上面的特殊处理 所以取出来的时候也会麻烦点# 查出报错trouble = [[s.index(i), i[0], i[2], i[1]] for i in s]data_new = [i.split("'")[1] for i in data_item]for i in range(len(data_new)):if trouble[i][3] == 'nvarchar' and len(data_new[i]) > trouble[i][2] or trouble[i][3] == 'varchar' and len(data_new[i]) > trouble[i][2]:row = int(data_item[0].split("'")[1])column = trouble[i][1]charter = data_new[i]print(f'第{row}行, {column}列, 字符: {charter}字符串过长')

 

 现在说明下上述注释掉的为什么要将data的value进行特殊处理 {data_item = [f"\'{row[column]}\'" for column in list(data.columns)]}

如果不进行特殊处理 我们拿出来的值是

这样 insert table的value(直接传入列表)对于Sqlserver语言来说 为错

有些人可能会说直接转换为tuple()  博主亲测错误,如果为元组 里面的字符串会不带' ',但是sqlserver是需要字符串带' '

时间类型的也可以像如上处理方式一样,类型转换错误会简单点  有其他任何方法 欢迎和博主讨论 都湿手打的 如果错误了 感谢提出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/304310.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站HTTP升级成为HTTPS的方法

将网站从HTTP免费升级为HTTPS&#xff0c;您可以按照以下步骤操作&#xff1a; 1. 选择证书颁发机构&#xff08;CA&#xff09;&#xff1a; - 为了免费升级&#xff0c;您可以选择使用JoySSL这样的公益项目。JoySSL提供免费、自动化的SSL/TLS证书颁发服务&#xff0c;适用于各…

三、Mat、Bitmap和Image数据类型之间的转换(OpenCvSharp)

在OpenCV中可以通过ImRead方法读取照片&#xff0c;通过ImShow方法显示照片&#xff1b;但是无法在PictureBox控件中显示 PictureBox控件只能展示Bitmap和Image数据类型图片 为此查阅了网上很多篇博文&#xff0c;将三种数据类型之间的转换进行了归纳整理&#xff0c;感谢网上…

【Qt】:对话框(一)

对话框 一.基本的对话框二.自定义对话框三.通过图形化界面自定义对话框四.关于对话框mode 对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口&#xff0c;出现在程序最上层&#xff0c;用于实现短期任务或者…

【mT5多语言翻译】之一——实战项目总览

[1] 总览 【mT5多语言翻译】系列共六篇文章&#xff1a; 【mT5多语言翻译】之一——实战项目总览   【mT5多语言翻译】之二——模型&#xff1a;T5模型与mT5模型与前置知识   【mT5多语言翻译】之三——数据集&#xff1a;多语言翻译数据集与预处理   【mT5多语言翻译】之…

cesium 添加动态波纹效果 圆形扩散效果 波纹材质

一、扩展材质 /*** 水波纹扩散材质* param {*} options* param {String} options.color 颜色* param {Number} options.duration 持续时间 毫秒* param {Number} options.count 波浪数量* param {Number} options.gradient 渐变曲率*/function CircleWaveMaterialProperty(opt…

代码随想录--数组--移除元素

题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度…

Win11 使用 WSL2 安装 linux 子系统 ubuntu

Win11 使用 WSL2 安装 linux 子系统 ubuntu 段子手168 1、用 部署映像服务和管理工具 dism.exe 命令&#xff0c;开启 WSL2 按【WIN R】&#xff0c;打开【运行】&#xff0c;输入&#xff1a;【cmd】&#xff0c;管理员打开【命令行提示符】。 启用适用于 Linux 的 Windo…

PHP自助建站系统,小白也能自己搭建网站

无需懂代码&#xff0c;用 自助建站 做企业官网就像做PPT一样简单&#xff0c;您可以亲自操刀做想要的效果&#xff01; 自助建站是一款简单、快捷、高效的工具&#xff0c;可以帮助您制作响应式网站。我们的自助建站系统&#xff0c;将传统的编码工作转化为直观的拖拽操作和文…

python 有哪些函数

Python内置的函数及其用法。为了方便记忆&#xff0c;已经有很多开发者将这些内置函数进行了如下分类&#xff1a; 数学运算(7个) 类型转换(24个) 序列操作(8个) 对象操作(7个) 反射操作(8个) 变量操作(2个) 交互操作(2个) 文件操作(1个) 编译执行(4个) 装饰器(3个) …

STM32H7通用定时器计数功能的使用

目录 概述 1 STM32定时器介绍 1.1 认识通用定时器 1.2 通用定时器的特征 1.3 递增计数模式 1.4 时钟选择 2 STM32Cube配置定时器时钟 2.1 配置定时器参数 2.2 配置定时器时钟 3 STM32H7定时器使用 3.1 认识定时器的数据结构 3.2 计数功能实现 4 测试案例 4.1 代码…

3D Matching:实现halcon中的find_surface_model

halcon中的三维匹配大致分为两类&#xff0c;一类是基于形状的(Shape-Based)&#xff0c;一类是基于表面的(Surface-Based)。基于形状的匹配可用于单个2D图像中定位复杂的3D物体&#xff0c;3D物体模型必须是CAD模型&#xff0c;且几何边缘清晰可见&#xff0c;使用的相机也要预…

废品回收 小程序+APP

用户实名认证、回收员实名认证、后台审核、会员管理、回收员管理、订单管理、提现管理、地图、档案管理。 支持&#xff0c;安卓APP、苹果APP、小程序 流程&#xff1a; 一、用户端下单&#xff0c;地图选择上门位置、填写具体位置、废品名称、预估重量、选择是企业废旧、家…

嵌入式ARM版本银河麒麟操作系统V10SP1安装OPenGauss数据库

前言&#xff1a; 官网提供了非常完整的openGauss安装步骤。 https://opengauss.org/zh/download/archive/列举一下个人的使用环境&#xff1a; 麒麟V10 rk3588工控板&#xff08;ARM&#xff09; openGauss-3.0.5&#xff08;极简版&#xff09;浏览一下官网&#xff0c;可以…

14款DevOps/SRE工具,助力提升运维效率

简介 随着平台工程的兴起&#xff0c;DevOps 和 SRE 不断发展&#xff0c;带来了新一代工具&#xff0c;旨在提高软件开发和运维的效率、可扩展性和可靠性。 在本篇文章中&#xff0c;我们将深入探讨一些最具发展前景的工具&#xff0c;它们正在塑造持续集成与部署、监控与可观…

特征融合篇 | YOLOv8改进之将Neck网络更换为多级特征融合金字塔HS-FPN | 助力小目标检测

前言:Hello大家好,我是小哥谈。HS-FPN(Hierarchical Scale Feature Pyramid Network)是一种用于目标检测任务的网络结构。它是在传统的Feature Pyramid Network(FPN)基础上进行改进的。HS-FPN的主要目标是解决目标检测中存在的多尺度问题。在传统的FPN中,通过在不同层级…

【网站项目】校园失物招领小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

上线数日暴涨600%市值直逼节点猴,Runestone符石为何成第二大比特币NFT?

NodeMonkes&#xff08;节点猴&#xff09;市值超越BAYC成为第二大NFT之际&#xff0c;凭借着不断上涨的市场热度和人气&#xff0c;符文项目Runestone在空投数日后也成功跻身为比特币生态市值第二大NFT。Runestone高共识背后的动因有哪些&#xff1f;又有哪些策略具有借鉴意义…

Qt 多窗体

前言 在 Qt编程中经常会遇到要在多个界面之间切换的情况&#xff0c;如从登录界面跳转到主界面&#xff0c;从主界面跳转到设置界面&#xff0c;再返回到主界面。我们将会用一个简单的示例来实现多窗体功能。 登录窗口 创建基类为QMainWindow&#xff0c;类名为LoginWin。再使用…

新零售SaaS架构:客户管理系统架构设计(万字图文总结)

什么是客户管理系统&#xff1f; 客户管理系统&#xff0c;也称为CRM&#xff08;Customer Relationship Management&#xff09;&#xff0c;主要目标是建立、发展和维护好客户关系。 CRM系统围绕客户全生命周期的管理&#xff0c;吸引和留存客户&#xff0c;实现缩短销售周…

记一次IP访问MySQL失败多次被自动锁定导致无法连接问题,解决方法只需一条SQL。

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 前言 今天下午还在带着耳机摸鱼&#xff…