1 # -*- coding: GBK -*- 2 3 import cx_Oracle 4 import MySQLdb 5 import datetime 6 7 ORACAL_HOST = "127.0.0.1" # oracle_數據庫ip 8 ORACAL_PORT = 1521 # oracle_數據庫端口 9 ORACAL_SID = "orcl" # oracle_數據庫名稱 10 ORACAL_USERNAME = "system" # oracle_數據庫用戶名 11 ORACAL_PASSWORD = "root" # oracle_數據庫用戶密碼 12 ORACAL_TABLE_NAME = "t_oracle" # oracle_數據庫表名 13 ORACAL_DB_CHARSET = "gbk" # oracle_數據庫編碼 14 15 MYSQL_HOST = "127.0.0.1" # mysql_數據庫ip 16 MYSQL_PORT = 3306 # mysql_數據庫端口 17 MYSQL_DB_NAME = "mysql_db" # mysql_數據庫名稱 18 MYSQL_USERNAME = "root" # mysql_數據庫用戶名 19 MYSQL_PASSWORD = "root" # mysql_數據庫用戶密碼 20 MYSQL_TABLE_NAME = "t_mysql" # mysql_數據庫表名 21 MYSQL_DB_CHARSET = "utf8" # mysql_數據庫編碼 22 23 LOG_FILE_NAME = "SyncLog.txt" # 日志文件名稱 24 25 data_from_oracle = [] # 存放從oracle讀取的數據 26 27 28 # 讀取oracle表 29 def read_from_oracle(): 30 global ORACAL_HOST, ORACAL_PORT, ORACAL_SID, ORACAL_USERNAME, ORACAL_PASSWORD, ORACAL_TABLE_NAME 31 32 dsn = cx_Oracle.makedsn(ORACAL_HOST, ORACAL_PORT, ORACAL_SID) 33 printLog("Connect to oracle DB start, ORACAL_HOST:" + ORACAL_HOST + ", ORACAL_PORT:" + str(ORACAL_PORT) 34 + ", ORACAL_SID:" + ORACAL_SID+ ", ORACAL_USERNAME:" + ORACAL_USERNAME ) 35 36 conn = cx_Oracle.connect(ORACAL_USERNAME, ORACAL_PASSWORD, dsn) 37 printLog("Connect to oracle DB success!") 38 39 cursor = conn.cursor() 40 sql = "select * from " + ORACAL_TABLE_NAME 41 cursor.execute(sql) 42 43 global data_from_oracle 44 data_from_oracle = cursor.fetchall() 45 printLog("Get total " + str(len(data_from_oracle)) + " datas from " + ORACAL_SID + "." + ORACAL_TABLE_NAME) 46 47 conn.close() 48 printLog("Connect to oracle DB closed.") 49 50 51 # 寫入mysql表 52 def write_to_mysql(): 53 global MYSQL_HOST, MYSQL_PORT, MYSQL_DB_NAME, MYSQL_USERNAME, MYSQL_PASSWORD, \ 54 MYSQL_DB_CHARSET, MYSQL_TABLE_NAME, ORACAL_DB_CHARSET 55 56 printLog("Connect to mysql DB start, MYSQL_HOST:" + MYSQL_HOST + ", MYSQL_PORT:" + str(MYSQL_PORT) 57 + ", MYSQL_DB_NAME:" + MYSQL_DB_NAME + ", MYSQL_USERNAME:" + MYSQL_USERNAME) 58 conn = MySQLdb.Connect(host=MYSQL_HOST, 59 port=MYSQL_PORT, 60 user=MYSQL_USERNAME, 61 passwd=MYSQL_PASSWORD, 62 db=MYSQL_DB_NAME, 63 charset=MYSQL_DB_CHARSET) 64 printLog("Connect to mysql DB success!") 65 66 cursor = conn.cursor() 67 sql = 'truncate table ' + MYSQL_TABLE_NAME 68 cursor.execute(sql) 69 printLog("Truncate table " + MYSQL_TABLE_NAME + " success!") 70 71 sql = get_insert_sql() 72 if sql is not None: 73 cursor.execute(sql) 74 conn.commit() 75 effectRow = cursor.rowcount 76 printLog("Write data to table " + MYSQL_TABLE_NAME + " success! Effect row:" + str(effectRow)) 77 else: 78 printLog("Total length of oracle data is zero, no insert!") 79 conn.close() 80 printLog("Connect to mysql DB closed.") 81 82 83 # 獲取插入mysql表的sql語句 84 def get_insert_sql(): 85 global data_from_oracle,MYSQL_TABLE_NAME 86 if len(data_from_oracle) == 0: 87 return None 88 sql = "INSERT INTO `" + MYSQL_TABLE_NAME + "` (name, age, sex) VALUES " 89 for item in data_from_oracle: 90 sql += "('" + item[0].strip() + "'," + item[1] + ",'" + item[2].strip() "')," 91 return sql[:-1] 92 93 94 95 # 打印日志 96 def printLog(content): 97 global LOG_FILE_NAME 98 f = open(LOG_FILE_NAME, 'a') 99 time = datetime.datetime.now() 100 timestr = time.strftime('%Y-%m-%d %H:%M:%S.%f') 101 f.write(timestr + ' :') 102 f.write(content + "\n") 103 f.close() 104 105 106 # 退出程序 107 def exit_program(): 108 printLog("Program exit.\n") 109 exit() 110 111 112 # 主程序 113 def main(): 114 try: 115 read_from_oracle() 116 write_to_mysql() 117 except Exception as e: 118 printLog("Error occurred!") 119 global ORACAL_DB_CHARSET 120 printLog(str(e).decode(ORACAL_DB_CHARSET).encode('utf-8')) 121 exit_program() 122 exit_program() 123 124 125 main()