一、代码截图:
二、测试截图:
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)