python cx_oracle操作数据库(一):将excle表导入数据库

前进的路途上总有踩不完的坑,只愿分享我的经验,让你少走弯路。

这段时间尝试用pythoncx_oracle去对oracle数据库进行操作,将表格导入数据库,在网上一篇博文,https://www.oschina.net/code/snippet_1185023_35839 感觉对于新手小白还是有很多的疑问存在,在此做了点优化,希望对自学的新手有所帮助。

代码:

#-*- coding: utf8 -*-
import cx_Oracle
import csv
import xlrd
import os

class ImportOracle(object):

    def __init__(self):
        self.filename = ""

    def inoracle(self):
        pass

    def ConnOracle(self):
        os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.utf8'#解决编码问题
        conn = cx_Oracle.connect('用户名/密码@oracle地址/库名')#连接数据库
        cursor = conn.cursor()#创建游标

        fields=[]
        # fields1 = [i + ' varchar2(200)' for i in self.title]
        # for i in self.title1:
        #     fields.append(i)
        # print(fields)
        #解决数据类型的问题
        for n in range(len(self.title1)):
            f=(type(self.title1[n]))#获取某列的数据类型
            #print(f)
            if f is float:#这里可以根据实际表格数据类型来进行判断
                fields.append(self.title[n] + ' number(20)')
            else:
                fields.append(self.title[n]+ ' varchar2(200)')
                #print(i)
        #print(fields)
        #     fields1.append(fields)
        # print(fields1)
        fields_str = ', '.join(fields)#把create table 的字段(列)进行格式化
        sql = 'create table %s (%s)' % (self.table_name, fields_str)
        print(sql)#打印创建table的SQL
        while 1:
            try:
                cursor.execute(sql)
                break
            except:
                cursor.execute('drop table {}'.format(self.table_name))#通过一个循环来避免tbale名已经被占用的问题,尝试创建,如果存在就执行drop table,直到可以创建就break退出循环。


        a = [':%s' % i for i in range(len(self.title) + 1)]
        value = ','.join(a[1:])
        sql = 'insert into %s values(%s)' % (self.table_name, value)#导入数据语句定义
        print(sql)#打印导入数据的sql
        print(self.data[2])#打印数据第三行数据(随便打印哪一行都可以,为了验正取到了数据)
        cursor.prepare(sql)
        for i in self.data:
            cursor.execute(None,i)#执行数据插入,这里是循环单条插入的方式。
        #cursor.executemany(None, self.data)
        #这是多条插入的方式,但是我在进行多条插入的时候又遇到了浮点数精度不一致的问题。。。

        cursor.close()#关闭游标
        conn.commit()#提交执行,增删改都需要进行提交。
        conn.close()#关闭数据库连接


class ImportOracleCsv(ImportOracle):
    def inoracle(self):
        with open(self.filename, 'rb') as f:
            reader = csv.reader(f)
            contents = [i for i in reader]

        title = contents[0]
        title1 = contents[1]
        data = contents[1:]

        return (title,title1,data)
#Csv格式读取

class ImportOracleExcel(ImportOracle):
    def inoracle(self):
        wb = xlrd.open_workbook(self.filename)
        sheet1 = wb.sheet_by_index(0)

        title = sheet1.row_values(0)
        title1 = sheet1.row_values(1)
        data = [sheet1.row_values(row) for row in range(1, sheet1.nrows)]
        return (title,title1,data)
#excle格式读取

class ImportError(ImportOracle):
    def inoracle(self):
        print('Undefine file type')
        return 0
#异常处理

class ChooseFactory(object):
    choose = {}
    choose['csv'] = ImportOracleCsv()
    choose['xlsx'] = ImportOracleExcel()
    choose['xls'] = ImportOracleExcel()

    def choosefile(self, ch):
        if ch in self.choose:
            op = self.choose[ch]
        else:
            op = ImportError()

        return op
#根据传入的表格的格式去判断用CSV格式读取还是excle格式读取,如果格式不是CSV和EXCLE则跳转报错

if __name__ == "__main__":
    file_name = 'XXXXXX.xlsx'#传入表格名
    table_name = 'xoxoxxo'#传入需要创建的数据库table名
    op = file_name.split('.')[-1]#切片所传入的表格名字字符串,为了去判断是什么格式的表格
    factory = ChooseFactory()#实例判断格式的class
    cal = factory.choosefile(op)#调用函数
    cal.filename = file_name
    (cal.title, cal.title1,cal.data) = cal.inoracle()
    cal.table_name = table_name
    cal.ConnOracle()

后续将更新利用cx_oracle导出数据写入excle的自学经验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值