达梦数据库-Dmpython+xlrd实现excel表数据一键入库代码分享
一、代码截图:
二、测试截图:
1、测试数据
(1)一个excel表格为一张表。
(2)第一行的元素为列名。
(3)数据中为空的地方会用空字符串补齐。
2、代码运行
(1)运行参数介绍
#数据库用户名
dm_user_name = ‘SYSDBA’
#数据库用户密码
dm_user_password = ‘SYSDBA’
#数据库IP地址
db_ip = ‘localhost’
#数据库端口号
db_port = 5236
#数据入库的表名
db_table_name = “TEST_EXCEL”
#EXCEL文件的路径
para_excel_file_path = r’C:\Users\22631\Desktop’
#EXCEL文件的名字
para_excel_file_name = “test.xlsx”
#dmpython接口批量插入的数据条数
insert_data_num = 10
#表中列的定义长度
type_len = 20
三、方法介绍
1、类DmSqlFunction(object)
对dmpython进行了简单封装。
(1)构造方法
__init__(self,user,password,server,port,autoCommit=True,local_code=dmPython.PG_UTF8)
参数介绍:
User #数据库用户名
Password #数据库用户密码
Server #数据库IP
Port #数据库端口号
autoCommit=True #是否自动提交,默认提交
local_code=dmPython.PG_UTF8 #字符集编码,默认UTF8
(2)__connect_db
参数介绍:
私有方法,连接数据库。
成功提示:connect database successful
错误提示:返回连接错误提示
(3)execute_sql
参数介绍:
Sql #传入的SQL语句
args=() #传入的参数,可以是列表或元组,默认传入空元组
fetch=True #是否是查询操作,True是,False否,默认是查询
executemany = False #是否批量执行,可以适当提升效率,默认是否
(4)Commit
数据提交。
(5)close_db
关闭游标和数据库连接。
2、函数excel_insert_data_to_db
(1)传入参数介绍
dm_user_name #数据库用户名 dm_user_password #数据库用户密码dm_ip #数据库IPdm_port #数据库端口号db_table_name #数据入库表名 para_excel_file_path #EXCEL文件的路径para_excel_file_name #EXCEL文件的名字insert_db_data_num #dmpython接口批量插入的数据条数type_len #表中列的定义长度
(2)实现思路简述
通过xlrd模块的内置方法获取EXCEL中数据的总列数,进行insert语句拼接,再获取EXCEL中数据的总行数,循环获取每一行数据,第一行的数据作为表中的各个列名,拼接出CREATE语句,后续数据为实际入库数据,每一行数数据作为一个LIST加入到一个总的LIST中,形成一个二维数组,进行批量插入,运行中如果数据入库报错,会自动把错误以追加的方式写入到py_error_当前日期.txt文件中。
在这里插入代码片
#encoding:utf-8
import xlrd
import os
import dmPython
import timeclass DmSqlFunction(object):def __init__(self,user,password,server,port,autoCommit=True,local_code=dmPython.PG_UTF8):self.__user = userself.__password = passwordself.__server = serverself.__port = portself.__autoCommit = autoCommitself.__local_code = local_codeself.__conn = Noneself.__cur = Noneself.__connect_db()def __connect_db(self):try:self.__conn = dmPython.connect(user=self.__user,password=self.__password,\server=self.__server,port=self.__port,\autoCommit=self.__autoCommit,local_code=self.__local_code,\connection_timeout=60,login_timeout=60)self.__cur = self.__conn.cursor()print('\nconnect database successful\n')except BaseException as e:print('__connect_db:\n')print(e)def execute_sql(self,sql,args=(),fetch=True,executemany = False):_rt_list = []if self.__cur:if fetch:self.__cur.execute(sql,args)_rt_list = self.__cur.fetchall()else:if executemany:self.__cur.executemany(sql,args)else:self.__cur.execute(sql,args)else:print('重连:%s'%self.__conn)self.__connect_db()if fetch:self.__cur.execute(sql,args)_rt_list = self.__cur.fetchall()else:if executemany:self.__cur.executemany(sql,args)else:self.__cur.execute(sql,args)return _rt_listdef commit(self):if self.__conn:self.__conn.commit()else:print('重连:%s'%self.__conn)self.__connect_db()self.__conn.commit()def close_db(self):self.commit()if self.__cur:self.__cur.close()self.__cur = Noneif self.__conn:self.__conn.close()self.__conn = Nonedef excel_insert_data_to_db(dm_user_name,dm_user_password,dm_ip,dm_port,db_table_name,para_excel_file_path,para_excel_file_name,insert_db_data_num,type_len):table_name = '\"'+ db_table_name + '\"'insert_data_num = insert_db_data_numinsert_data_num_flag = 0data_list = []sql_drop = 'drop table {table_name}'.format(table_name=table_name)Dm_Conn_y = DmSqlFunction(dm_user_name,dm_user_password,dm_ip,dm_port)try:Dm_Conn_y.execute_sql(sql_drop,fetch=False)except BaseException as e :print("执行sql_drop语句报错无影响:")print("%s\n"%e)excel_file_path = para_excel_file_pathprint("当前目录:%s\n"%os.getcwd()) #获取当前目录os.chdir(excel_file_path) #更换目录print("更换当前目录:%s\n"%os.getcwd()) #获取当前目录# 操作excelexcel = xlrd.open_workbook(para_excel_file_name)excel.sheet_names() # 获取excel里的工作表sheet名称数组sheet = excel.sheet_by_index(0) #根据下标获取对应的sheet表print("总共的行数:%s\n"%sheet.nrows)print("总共的列数:%s\n"%sheet.ncols)print("一次性插入条数:%s\n"%insert_data_num)table_column_index = 0 #表头索引下标insert_sql = 'insert into {table_name} values('.format(table_name=table_name)for x in range(sheet.ncols):if x == sheet.ncols - 1:insert_sql = insert_sql + '?)'else:insert_sql = insert_sql + '?,'print("insert_sql:%s\n"%insert_sql)for i in range(sheet.nrows): #sheet.nrow获取总共的行数if i == 0: #这一层主要目的是根据excel表头去创建表print("表头:%s\n"%sheet.row_values(i))sql_create = 'create table {table_name} ('.format(table_name=table_name)for j in sheet.row_values(i):table_column_index += 1if j == sheet.row_values(i)[-1] : #获取总共的列数sheet.ncolsif len(j) == 0:sql_create = sql_create + '"'+ 'empty_column' +str(table_column_index)+ '"' + r' varchar2(%s) )'%type_lenelse:sql_create = sql_create + '"'+ j + '"'+ r' varchar2(%s) )'%type_lenelse:if len(j) == 0:sql_create = sql_create + '"'+ 'empty_column' + str(table_column_index) + '"'+ r' varchar2(%s),'%type_lenelse:sql_create = sql_create + '"'+ j + '"'+ r' varchar2(%s),'%type_lenprint("sql_create:%s\n"%sql_create)try:Dm_Conn_y.execute_sql(sql_create,fetch=False)print("执行sql_create语句成功\n")print("=============================\n")except BaseException as e :print("执行sql_create语句报错:")print("%s\n"%e)dm = open('py_error_{sysdate}.txt'.format(sysdate=time.strftime("%Y-%m-%d", time.localtime()) ),'a')dm.write("第%s条执行sql_create语句:%s 出现错误\n错误为:%s\n\n"%(i,sql_create,e))dm.close()print("=============================\n")else: #这一层主要目的是根据excel表数据进行数据插入try:print("第%s条数据:%s\n"%(i,sheet.row_values(i)))data_list.append(sheet.row_values(i))print("data_list:%s\n"%data_list)insert_data_num_flag += 1print("insert_data_num_flag:%s insert_data_num:%s\n"%(insert_data_num_flag,insert_data_num))if insert_data_num_flag == insert_data_num or i == sheet.nrows - 1:Dm_Conn_y.execute_sql(insert_sql,data_list,fetch=False,executemany = True)Dm_Conn_y.commit()print("执行insert_sql语句成功\n")print("=============================\n")data_list = []insert_data_num_flag = 0except BaseException as e :print("执行insert_sql语句报错:")print("%s\n"%e)dm = open('py_error_{sysdate}.txt'.format(sysdate=time.strftime("%Y-%m-%d", time.localtime()) ),'a')dm.write("插入行数:%s\n执行到第%s条数据:\n%s\n出现错误\n执行sql为:%s\n错误为:%s\n\n"%(insert_data_num,i,data_list,insert_sql,e))dm.close()print("=============================\n")Dm_Conn_y.commit()Dm_Conn_y.close_db()if __name__=='__main__':dm_user_name = 'SYSDBA'dm_user_password = 'SYSDBA'db_ip = '192.168.1.34'db_port = 5236db_table_name = "TEST_EXCEL"para_excel_file_path = r'C:\\Users\\22631\\Desktop'para_excel_file_name = "test.xlsx"insert_data_num = 10type_len = 20time1 = time.time()excel_insert_data_to_db(dm_user_name,dm_user_password,db_ip,db_port,db_table_name,para_excel_file_path,para_excel_file_name,insert_data_num,type_len)time2 = time.time()result_value = int(round(time2 * 1000)) - int(round(time1 * 1000))print("耗时为:%s ms"%result_value)
达梦数据库-Dmpython+xlrd实现excel表数据一键入库代码分享相关推荐
- 达梦数据库查询模式名,表名,字段名
达梦数据库查询模式名,表名,字段名 查询所有的模式名 SELECT DISTINCT object_name FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'SCH' 根据 ...
- 0基础学挨踢-国产达梦数据库dmPython安装和避坑(Windows/Linux,离线状态)
题主还在苦逼的实习生涯中,由于是中国电信,所以处于安全和可控性,目前正在逐步转向国产数据库,例如金蝶,武汉达梦,人大金仓等国产数据库,但是国产数据库比较有趣(折磨),比如达梦家的dmPython就给我 ...
- 达梦数据库物理备份恢复_表空间级备份还原
参考文档<DM8备份恢复手册> 1.表空间级备份还原 联机备份,脱机还原 表空间备份还原的先决条件以及限制条件参考<DM8备份恢复手册>. 1.1 备份 BACKUP V1.0 ...
- 达梦数据库实验三:DMDBMS表查询操作
目录标题 实验三 DMDBMS表查询操作 一.实验目的: 二.实验要求: 三.实验重点和难点: 四.实验内容: 五.实验步骤与结果: 1. 表创建 2. 数据填充 3. 数据查询 3.1查出选修了20 ...
- 达梦数据库统计模式下所有表记录数
/* 统计每个表的数据量到表数据记录表 */ --创建一张表记录统计信息 create table test(tab_name varchar(30),row_num int) --统计每个表的数据量 ...
- 基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作
由于一个客户朋友的需求,需要我的Winform开发框架支持国产达梦数据库的操作,这个数据库很早就听过,但是真正一般项目用的很少,一般在一些特殊的项目可能需要用到.由于我的Winform开发框架,是基于 ...
- 达梦数据库导入oracle数据_达梦数据库和oracle数据的一些区别
近期我在考达梦的dca发现有一些和oracle不同的地方,由于我是oracleDBA在维护达梦数据库的时候有需要注意的地方,现在分享一下2个数据库的一些区别. 1.登陆的区别 oracle:如果sys ...
- 达梦数据库安装学习总结--DCA上篇
达梦数据库DCA概述 达梦数据库是一款完全自主原创的国产数据库,国产的操作系统及国产的数据库在国内使用不断扩大,升级及发展也日新月异,其中达梦数据库在政府及事业单位就得到广泛应用. DCA课程学习使用 ...
- 达梦数据库(达梦8)DCA认证考试
##达梦数据库(DM8)DCA认证## DCA考试环境一般都是符合安装的环境,网上要求的检查环境方面的工作可以不用做,珍惜时间,vnc远程登录后先打开桌面上的试卷,按照试卷上的命令在终端上输入,然后就 ...
- DM8达梦数据库数据文件整体迁移方式
目录 一.前要 二.模拟环境准备: 三.名词定义 3.1 表空间和数据文件 3.2 重做日志(redo) 3.3 控制文件(dm.ctl) 3.4 参数文件(dm.ini) 3.5 dminit工具 ...
最新文章
- 计算机网络协议分层体系结构
- 微信小程序开发之选项卡
- 设计模式——开发常用的设计模式梳理
- conda切换环境_Python多环境管理,你需要知道的几种方法
- 监控摄像头服务器维护要多久,监控摄像机怎么维护和保养?
- C语言switch怎么算,超级新手,用switch写了个计算器程序,求指导
- sql数据导入错误代码: 0x80004005_PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR...
- SpringCloud学习笔记024---SpringBoot中使用大部分公用的配置记录
- VC字符处理(二)转换(修改)
- 【干货】前端开发VUE实例
- Flutter 城市/通讯录列表字母索引联动效果实现
- 幸运彩票 分数 15作者 陈越单位 浙江大学
- FPGA分频电路实现(奇数,偶数,小数半分频,任意分频)
- imovie导入媒体没有声音的解决办法
- HIT-哈工大数据结构-作业1(C++)
- html 取消settimeout,JavaScript中停止执行setInterval和setTimeout事件的方法
- ch1_2 二分查找 C++
- 齐聚绿城 | 锦江都城酒店聚焦中高端酒店投资新方向
- 小程序实战—答题类小程序
- 使用git控制word版本