高效地将CSV导入Oracle表(Python)

时间:2017-08-10 00:23:54

标签: python sql oracle csv cx-oracle

我正在使用Python 3.6来遍历文件夹结构,并将我要导入的所有这些CSV的文件路径返回到两个已创建的Oracle表中。

con = cx_Oracle.connect('BLAH/BLAH@XXX:666/BLAH')

#Targets the exact filepaths of the CSVs we want to import into the Oracle database
if os.access(base_cust_path, os.W_OK):
    for path, dirs, files in os.walk(base_cust_path):
        if "Daily" not in path and "Daily" not in dirs and "Jul" not in path and "2017-07" not in path:
            for f in files:
                if "OUTPUT" in f and "MERGE" not in f and "DD" not in f:
                    print("Import to OUTPUT table: "+ path + "/" + f)
                    #Run function to import to SQL Table 1
                if "MERGE" in f and "OUTPUT" not in f and "DD" not in f:
                    print("Import to MERGE table:  "+ path + "/" + f)
                    #Run function to import to SQL Table 2

前一段时间我能够使用PHP生成一个对SQL Server使用BULK INSERT SQL命令的函数:

function bulkInserttoDB($csvPath){
    $tablename = "[DATABASE].[dbo].[TABLE]";
    $insert = "BULK
                INSERT ".$tablename."
                FROM '".$csvPath."'
                WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\\n')";

    print_r($insert);
    print_r("<br>");

    $result = odbc_prepare($GLOBALS['connection'], $insert);
    odbc_execute($result)or die(odbc_error($connection));
}

我本来想为Python复制这个,但是一些谷歌的搜索让我相信没有&#39; BULK INSERT&#39; Oracle命令。这个BULK INSERT命令具有很棒的性能。

由于我加载的这些CSV很大(2GB x 365),因此性能至关重要。这样做最有效的方法是什么?

1 个答案:

答案 0 :(得分:0)

使用cx_oracle库和命令

进行批量插入
con = cx_Oracle.connect(CONNECTION_STRING)
cur= con.cursor()
cur.prepare("INSERT INTO MyTable values (
                    to_date(:1,'YYYY/MM/DD HH24:MI:SS'), 
                    :2,
                    :3,
                    to_date(:4,'YYYY/MM/DD HH24:MI:SS'), 
                    :5,
                    :6,
                    to_date(:7,'YYYY/MM/DD HH24:MI:SS'), 
                    :8,
                    to_date(:9,'YYYY/MM/DD HH24:MI:SS'))"
            ) ##prepare your statment
list.append((sline[0],sline[1],sline[2],sline[3],sline[4],sline[5],sline[6],sline[7],sline[8])) ##prepare your data
cur.executemany(None, list) ##insert

准备插入声明。然后存储文件和列表。最后你执行了很多。它会瘫痪一切。