教你如何運用python實現不同資料庫間資料同步功能
導讀 | 這篇文章主要介紹了python實現不同資料庫間資料同步功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑑價值,需要的朋友可以參考下 |
功能描述
資料庫間資料同步方式很多,在上篇博文中有總結。本文是用py程式實現資料同步。
A資料庫中有幾十張表,要匯聚到B資料庫中,且表結構一致,需要準實時的進行資料同步,用工具實現時對其控制有限且配置較繁瑣,故自寫程式,可自由設定同步區間,記錄自己想要的日誌
程式碼
本程式碼實現功能簡單,採用程式導向,有需求的同學可以自己最佳化成物件導向方式,在日誌這塊缺少資料監控,可根據需求增加。主要注意點:
1、資料抽取時採用區間抽取(按時間區間)、流式遊標迭代器+fetchone,避免記憶體消耗
2、在資料插入時採用executemany(list),加快插入效率
import pymysql import os import datetime,time def update_time(content): with open(filepathtime, 'w') as f: f.writelines(content) def recode_log(content): with open(filepathlog, 'a') as f: f.writelines(content) def transferdata(): #1、獲取需要抽取的表,抽取資料的時間點 with open(filepathtime, 'r') as f: lines = f.readlines() # 讀取所有資料 print("需要同步的表資訊",lines) for line in lines: startdatetime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) tablename_list =line.split(',') #print(tablename_list) #print(tablename_list[-1]) tablename_list[-1] = tablename_list[-1].replace('\n','') #print(tablename_list) tablename = tablename_list[0] updatetime = tablename_list[1] #print(tablename,updatetime) #2、抽取此表此時間點的資料,同步 updatetime_s = datetime.datetime.strptime(updatetime, '%Y-%m-%d %H:%M:%S') updatetime_e = (updatetime_s + datetime.timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S") #print(updatetime_s) #print(q_sql) db = pymysql.connect(host=host_o, port=port_o, user=user_o, passwd=passwd_o, db=db_o) cursor = db.cursor() q_sql = "select a,b,c from %s where c >= '%s' " % \ (tablename, updatetime_s) #2.1 首先判斷下原表中是否有待同步資料,若有則同步且更新同步的時間參考點,若沒有則不同步且不更新同步的時間參考點 try: cursor.execute(q_sql) results = cursor.fetchone() #print(results) #返回是元組 #print("查詢原表資料成功!",tablename) except BaseException as e: print("查詢原表資料失敗!",tablename, str(e)) #記錄異常日誌 updatetime_n = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) eachline_log = updatetime_n + '[erro]:' + tablename + str(e) + '\n' content_log.append(eachline_log) recode_log(content_log) db.close() if results: print("===============================================================================") print("有資料可同步",tablename) db = pymysql.connect(host=host_o, port=port_o, user=user_o, passwd=passwd_o, db=db_o, charset='utf8', cursorclass=pymysql.cursors.SSDictCursor) cursor = db.cursor() q_sql1 = "select a,b,c from %s where c >= '%s' and c < '%s' " % \ (tablename, updatetime_s, updatetime_e) #print(q_sql1) result_list = [] try: # startdatetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) cursor.execute(q_sql1) #results = cursor.fetchall() # enddatetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # print(results) #返回是元組 #使用流式遊標迭代器+fetchone,減少記憶體消耗 while True: result = cursor.fetchone() if not result: print("此區間無資料", q_sql1) break else: one_list = list(result.values()) # print(result_list) result_list.append(one_list) print(result_list) #返回是列表 #print("查詢資料成功!", tablename) except BaseException as e: print("查詢資料失敗!", tablename, str(e)) # 記錄異常日誌 updatetime_n = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) eachline_log = updatetime_n + '[erro]:' + tablename + str(e) + '\n' content_log.append(eachline_log) recode_log(content_log) db.close() results_len = (len(result_list)) if results_len>0: #3、將資料插入到目標表中,利用list提高插入效率 i_sql = "insert into table_t(a,b,c) values (%s,%s,%s)" #print(i_sql) db = pymysql.connect(host=host_d, port=port_d, user=user_d, passwd=passwd_d, db=db_d) cursor = db.cursor() try: #startdatetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) cursor.executemany(i_sql, result_list) db.commit() #enddatetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) print("插入成功!",tablename) except BaseException as e: db.rollback() print("插入失敗!", tablename,str(e)) #記錄異常日誌 updatetime_n = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) eachline_log = updatetime_n + '[erro]:' + tablename + str(e) + '\n' content_log.append(eachline_log) recode_log(content_log) db.close() enddatetime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) #4、如果有資料同步,則更新參考點時間為下一個節點時間 eachline_time = tablename+','+updatetime_e+'\n' #此時間點是下一個時間點updatetime_e content_time.append(eachline_time) print("更新表時間點",content_time) # 5、記錄成功日誌 eachline_log = enddatetime + '[success]:' + tablename + '開始時間' + startdatetime + \ '結束時間' + enddatetime + ',同步資料量'+str(results_len)+',當前參考點' + updatetime_e + '\n' content_log.append(eachline_log) print("日誌資訊",content_log) #print("===============================================================================") else: print("===============================================================================") print("無資料可同步",tablename) #db.close() enddatetime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) # 4、如果無資料同步,則參考點時間不更新 eachline_time = tablename + ',' + updatetime + '\n' #此時間點還是原時間updatetime content_time.append(eachline_time) print("不更新表時間點",content_time) # 5、成功日誌資訊 eachline_log = enddatetime + '[success]:' + tablename + '開始時間' + startdatetime + \ '結束時間' + enddatetime + ',同步資料量0'+ ',當前參考點' + updatetime_e + '\n' content_log.append(eachline_log) print("日誌資訊",content_log) #print("===============================================================================") #更新配置檔案,記錄日誌 update_time(content_time) recode_log(content_log) if __name__ == '__main__': filepathtime = 'D:/test/table-time.txt' filepathlog = 'D:/test/table-log.txt' host_o = 'localhost' port_o = 3306 user_o = 'root' passwd_o = 'root@123' db_o = 'csdn' host_d = 'localhost' port_d = 3306 user_d = 'root' passwd_d = 'root@123' db_d = 'csdn' content_time = [] content_log = [] transferdata() #每5分鐘執行一次同步 # while True: # transferdata() # time.sleep(300)
table-time.txt配置檔案,格式說明:
每行包括源庫表名、此表的最小時間time,以逗號分隔若多個表,可配置多個時間每次 執行後,同步更新時間time。時間間隔設定為1小時,可根據情況在updatetime_e中對增量進行修改
table-log.txt
記錄每次同步任務執行的結果,或執行中發生異常的日誌,此檔案需要定期進行清理。
到此這篇關於python實現不同資料庫間資料同步功能的文章就介紹到這了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2762346/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料同步:教你如何實時把資料從 MySQL 同步到 OceanBaseMySql
- Spring Boot應用中如何動態指定資料庫,實現不同使用者不同資料庫的場景Spring Boot資料庫
- 教你如何使用flask實現ajax資料入庫Flask
- 教你如何實現頁面間的資料通訊
- 利用python實現mysql資料庫向sqlserver的同步PythonMySql資料庫Server
- 如實實現不同資料庫之間的 (模型) Eloquent: 關聯資料庫模型
- 手把手教你用ManagedSQLiteOpenHelper實現資料庫SQLite資料庫
- 教你如何運用python實現學生資訊管理系統Python
- 高效資料移動指南 | 如何快速實現資料庫 SQL Server 到 Dameng 的資料同步?資料庫SQLServer
- 資料庫系列——基於Canal實現MySQL增量資料同步資料庫MySql
- 如何在資料庫中高效實現訂座功能?資料庫
- Restcloud ETl資料通過時間戳實現增量資料同步RESTCloud時間戳
- 如何在 PyQt 中實現非同步資料庫請求QT非同步資料庫
- Kafka 叢集如何實現資料同步?Kafka
- python如何將資料插入資料庫Python資料庫
- 資料庫同步資料庫
- Kafka Connect如何實現同步RDS binlog資料?Kafka
- Linux 伺服器如何實現資料同步?Linux伺服器
- 用canal監控binlog並實現mysql定製同步資料的功能MySql
- 資料庫同步你們用啥資料庫
- python+資料庫(三)用python對資料庫基本操作Python資料庫
- 資料庫 表單運用資料庫
- (7)資料庫讀寫分離,主從同步實現方法(資料庫設定)資料庫主從同步
- Linux 實現本、異地遠端資料實時同步功能Linux
- 教你如何無程式碼整合連線多個不同型別資料庫型別資料庫
- DataX將MySql資料庫資料同步到Oracle資料庫MySql資料庫Oracle
- 如何實現資料庫資料到Abp vnext實體物件的同步?以及程式碼生成工具資料庫物件
- Java實戰:教你如何進行資料庫分庫分表Java資料庫
- 如何高效實現 MySQL 與 elasticsearch 的資料同步MySqlElasticsearch
- ogg在異構資料庫實時雙向同步中如何防止資料死迴圈同步資料庫
- Python3爬蟲資料入資料庫---把爬取到的資料存到資料庫,帶資料庫去重功能Python爬蟲資料庫
- Python 如何實現資料視覺化Python視覺化
- 如何實現一個資料庫的 UDF?圖資料庫 NebulaGraph UDF 功能背後的設計與思考資料庫
- DataX將Oracle資料庫資料同步到達夢資料庫Oracle資料庫
- 不同型別資料運算型別
- [譯] 在 Python 中,如何運用 Dask 資料進行並行資料分析Python並行
- 教你如何運用python/golang實現迴圈連結串列PythonGolang
- 資料自動同步方案實施指南:企業如何實現高效資料流轉?