达梦数据库-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                                   #数据库IP

dm_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 time

class DmSqlFunction(object):
    def __init__(self,user,password,server,port,autoCommit=True,local_code=dmPython.PG_UTF8):
        self.__user = user
        self.__password = password
        self.__server = server
        self.__port = port
        self.__autoCommit = autoCommit
        self.__local_code = local_code
        self.__conn = None
        self.__cur = None
        self.__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_list


    def 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 = None

        if self.__conn:
            self.__conn.close()
            self.__conn = None


def 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_num
        insert_data_num_flag = 0
        data_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_path
        print("当前目录:%s\n"%os.getcwd())    #获取当前目录
        os.chdir(excel_file_path)     #更换目录
        print("更换当前目录:%s\n"%os.getcwd())     #获取当前目录

        # 操作excel
        excel = 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 += 1
                     if j  == sheet.row_values(i)[-1] :   #获取总共的列数sheet.ncols
                         if len(j) == 0:
                             sql_create = sql_create + '"'+ 'empty_column' +str(table_column_index)+ '"' + r' varchar2(%s) )'%type_len
                         else:
                             sql_create = sql_create + '"'+ j + '"'+ r' varchar2(%s) )'%type_len
                     else:
                         if len(j) == 0:
                             sql_create = sql_create + '"'+ 'empty_column' + str(table_column_index) + '"'+ r' varchar2(%s),'%type_len
                         else:
                             sql_create = sql_create + '"'+ j + '"'+ r' varchar2(%s),'%type_len

                 print("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 += 1
                        print("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 = 0
                    except 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 = 5236
    db_table_name =  "TEST_EXCEL"
    para_excel_file_path = r'C:\\Users\\22631\\Desktop'
    para_excel_file_name = "test.xlsx"
    insert_data_num = 10
    type_len = 20
    time1 = 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)


  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值