pyhton Oracle 程序示例

1、pyhton 读写 Oracle 数据

import cx_Oracle

def real_save_to_oracle( lst_file_name, stpf_result_data_dir, dict_area_no ):
    conn = cx_Oracle.connect( "SYSDBA/123456@192.168.1.210/orcl" )
    cursor = conn.cursor()

    for file_name in lst_file_name:
        str_suffix = file_name[-4:]
        if str_suffix != ".csv":
            continue
        file_path = os.path.join( stpf_result_data_dir, file_name )
        df_data = pd.read_csv( file_path )

        file_name = file_name.split("_")[1]
        for _, row_data in df_data.iterrows():
            area_no = dict_area_no[ file_name ]
            print( area_no, file_name )
            str_time = row_data["Time"]
            d_P_real = row_data["P_use"]
            d_Q_real = row_data["Q_use"]

            str_sql = """select * from WF_STAT_PERIOD_DATA where WINDPLANT_NO=%d and
                        DATA_TIME=to_date( '%s', 'yyyy-MM-dd HH24:mi:ss')""" % ( area_no, str_time )
            cursor.execute( str_sql )
            lst_result = cursor.fetchall()
            print( type( lst_result ), lst_result )
            if len( lst_result ) > 0:
                str_sql = """update WF_STAT_PERIOD_DATA set AVG_TEMP=%f, AVG_WIND_SPEED=%f where WINDPLANT_NO=%d and
                        DATA_TIME=to_date( '%s', 'yyyy-MM-dd HH24:mi:ss')""" % ( d_P_real, d_Q_real, area_no, str_time )
                cursor.execute( str_sql )
            else:
                str_sql = """insert into WF_STAT_PERIOD_DATA values
                            ( %d, to_date( '%s', 'yyyy-MM-dd HH24:mi:ss'), 0, 0, 0, 0, 0, %f,
                            %f, 0, 1 )""" % ( area_no, str_time, d_Q_real, d_P_real )
                cursor.execute( str_sql )
            cursor.execute( "COMMIT" )
            time.sleep( 0.01 )
    # select * from PV_AREA_PF_PERIOD_DATA where AREA_NO=37 and MODEL_NO = 0 and TIME_SCALE=-1;
    cursor.close()
    conn.close()
    return None

2、python 批量插入数据 到 Oracle

def stpf_save_to_oracle( lst_file_name, stpf_result_data_dir, dict_area_no ):
    conn = cx_Oracle.connect( "SYSDBA/123456@192.168.1.210/orcl" )
    cursor = conn.cursor()

    for area_name, area_no in dict_area_no.items():
        file_name = area_name + "_stpf.csv"
        file_path = os.path.join( stpf_result_data_dir, file_name )
        print( area_no, file_path )

        df_data = pd.read_csv( file_path )
        lst_data = [] #( AREA_NO, MODEL_NO, TIME_SCALE, DATA_TIME, P_VALUE, DATA_FLAG )
        for _, row_data in df_data.iterrows():
            str_time = row_data["Time"]
            d_P_stfp = row_data["P_stpf"]
            data_time = datetime.datetime.strptime( str_time, "%Y-%m-%d %H:%M:%S" )
            lst_data.append(( area_no, 0, -1, data_time, d_P_stfp, 1 ))
        print( lst_data[:3] )

        str_sql = """insert into PV_AREA_PF_PERIOD_DATA values
                    ( :AREA_NO, :MODEL_NO, :TIME_SCALE, :DATA_TIME, :P_VALUE, :DATA_FLAG )"""
        cursor.executemany( str_sql, lst_data )
        cursor.execute( "COMMIT" )

    cursor.close()
    conn.close()
    return None

3、python 批量更新数据 到 Oracle

def kuixian_and_sum_save_to_oracle( kuixian_p_data_file, sum_p_data_file, area_no=0 ):
    conn = cx_Oracle.connect(  "SYSDBA/123456@192.168.1.210/orcl" )
    cursor = conn.cursor()

    # read data
    df_data_kuixian = pd.read_csv( kuixian_p_data_file ) #[ "Time", "P" ]
    df_data_kuixian[ "Time" ] = pd.to_datetime( df_data_kuixian[ "Time" ] )
    df_data_kuixian[ "P" ] *= 1000 #KW

    df_data_sum = pd.read_csv( sum_p_data_file, usecols=[ "Time", "P_Total" ] )
    df_data_sum[ "Time" ] = pd.to_datetime( df_data_sum[ "Time" ] )

    print( df_data_kuixian.head() )
    print( df_data_sum.head() )
    df_data = pd.merge( df_data_sum, df_data_kuixian, how="left", left_on="Time", right_on="Time" )
    print( df_data.head() )

    # update data to oracle
    # SELECT * FROM WF_STAT_PERIOD_DATA WHERE WINDPLANT_NO=0 and DATA_TIME>TO_DATE( '2020-07-23', 'yyyy-MM-dd HH24:mi:ss' );
    lst_data = [] #批量数据列表
    for _, row_data in df_data.iterrows():
        d_P_kuixian = row_data["P"]
        d_P_sum = row_data["P_Total"]
        data_time = row_data["Time"]
        lst_data.append({ "V_1":d_P_kuixian, "V_2":d_P_sum, "V_3":data_time })
    print( "lst_data:\n", lst_data[:3] )

    #AVT_TMP: sum , P2: kuixian power
    str_sql = """update WF_STAT_PERIOD_DATA set P2=:V_1, AVG_TEMP=:V_2
                where WINDPLANT_NO=0 and DATA_TIME=:V_3""" #批量更新数据的SQL语句
    cursor.executemany( str_sql, lst_data )
    cursor.execute( "COMMIT" )

    cursor.close()
    conn.close()
    return None