下載吧 - 綠色安全的游戲和軟件下載中心

軟件下載吧

當前位置:軟件下載吧 > 數據庫 > MS_SQL > Python實現SQL Server數據庫實現對象同步輕量級

Python實現SQL Server數據庫實現對象同步輕量級

時間:2024-02-05 11:03作者:下載吧人氣:28

緣由

日常工作中經常遇到類似的問題:把某個服務器上的某些指定的表同步到另外一臺服務器。

類似需求用SSIS或者其他ETL工作很容易實現,比如用SSIS的話,就會會存在相當一部分反復的手工操作。

建源的數據庫信息,目標的數據庫信息,如果是多個表,需要一個一個地拉source和target,然后一個一個地mapping,然后運行實現數據同步。

然后很可能,這個workflow使用也就這么一次,就壽終正寢了,卻一樣要浪費時間去做這個ETL。

快速數據同步實現

于是在想,可不可能快速實現類似需求,盡最大程度減少重復的手工操作?類似基于命令行的方式,簡單快捷,不需要太多的手動操作。

于是就有了本文,基于Python(目的是順便熟悉一下Python的語法),快速實現SQL Server的數據庫之間的數據同步操作,后面又稍微擴展了一下,可以實現不同服務器的數據庫之間的表結構,表對應的數據,存儲過程,函數,用戶自定義類型表(user define table type)的同步

目前支持在兩個SQL Server數據源之間:每次同步一張或者多張表/存儲過程,也可以同步整個數據庫的所有表/存儲過程(以及表/存儲過程依賴的其他數據庫對象)。

支持sqlserver2012以上版本

需要考慮到一些基本的校驗問題:在源服務器上,需要同步的對象是否存在,或者輸入的對象是否存在于源服務器的數據庫里。

在目標服務器上,對于表的同步:

1,表的存在依賴于schema,需要考慮到表的schema是否存在,如果不存在先在target庫上創建表對應的schema

2,target表中是否有數據?如果有數據,是否以覆蓋的方式執行

對于存儲過程的同步:

1,類似于表,需要考慮存儲過程的schema是否存在,如果不存在先在target庫上創建表對應的schema
2,類似于表,arget數據庫中是否已經存在對應的存儲過程,是否以覆蓋的方式執行
3,存儲過程可能依賴于b表,某些函數,用戶自定義表變量等等,同步存儲過程的時候需要先同步依賴的對象,這一點比較復雜,實現過程中遇到在很多很多的坑

  可能存在對象A依賴于對象B,對象B依賴于對象C……,這里有點遞歸的意思

  這一點導致了重構大量的代碼,一開始都是直來直去的同步,無法實現這個邏輯,切實體會到代碼的“單一職責”原則

參數說明

參數說明如下,大的包括四類:

1,源服務器信息 (服務器地址,實例名,數據庫名稱,用戶名,密碼),沒有用戶名密碼的情況下,使用windows身份認證模式

2,目標服務器信息(服務器地址,實例名,數據庫名稱,用戶名,密碼),沒有用戶名密碼的情況下,使用windows身份認證模式

3,同步的對象類型以及對象

4,同步的對象在目標服務器上存在的情況下,是否強制覆蓋

Python實現SQL Server數據庫實現對象同步輕量級

其實在同步數據的時候,也可以把需要同步的行數提取出來做參數,比較簡單,這里暫時沒有做。

比如需要快速搭建一個測試環境,需要同步所有的表結構和每個表的一部分數據即可。

表以及數據同步

表同步的原理是,創建目標表,遍歷源數據的表,生成insert into values(***),(***),(***)格式的sql,然后插入目標數據庫,這里大概步驟如下:

1,表依賴于schema,所以同步表之前先同步schema

2,強制覆蓋的情況下,會drop掉目標表(如果存在的話),防止目標表與源表結構不一致,非強制覆蓋的情況下,如果字段不一致,則拋出異常

3,同步表結構,包括字段,索引,約束等等,但是無法支持外鍵,刻意去掉了外鍵,想想為什么?因吹斯汀。

4,需要篩選出來非計算列字段,insert語句只能是非計算列字段(又導致重構了部分代碼)

5,轉義處理,在拼湊SQL的時候,需要進行轉義處理,否則會導致SQL語句錯誤,目前處理了字符串中的’字符,二進制字段,時間字段的轉義處理(最容易發生問題的地方)

6,鑒于insert into values(***),(***),(***)語法上允許的最大值是1000,因此每生成1000條數據,就同步一次

7,自增列的identity_insert 標識打開與關閉處理

使用如下參數,同步源數據庫的三張表到目標數據庫,因為這里是在本機命名實例下測試,因此實例名和端口號輸入

執行同步的效果

Python實現SQL Server數據庫實現對象同步輕量級

說明:

1,如果輸入obj_type=”tab” 且-obj=為None的情況下,會同步源數據庫中的所有表。
2,這個效率取決于機器性能和網絡傳輸,本機測試的話,每秒中可以提交3到4次,也就是每秒鐘可以提交3000~4000行左右的數據。

已知的問題:

1,當表的索引為filter index的時候,無法生成包含where條件的索引創建語句,那個看起來蛋疼的表結構導出語句,暫時沒時間改它。
2,暫時不支持其他少用的類型字段,比如地理空間字段什么的。

存儲過程對象的同步

存儲過程同步的原理是,在源數據庫上生成創建存儲過程的語句,然后寫入目標庫,這里大概步驟如下:
1,存儲過程依賴于schema,所以同步存儲過程之前先同步schema(同表)
2,同步的過程會檢查依賴對象,如果依賴其他對象,暫停當前對象同步,先同步依賴對象
3,重復第二步驟,直至完成
4,對于存儲過程的同步,如果是強制覆蓋的話,強制覆蓋僅僅對存儲過程自己生效(刪除&重建),對依賴對象并不生效,如果依賴對象不存在,就創建,否則不做任何事情

使用如下參數,同步源數據庫的兩個存儲過程到目標數據庫,因為這里是在本機命名實例下測試,因此實例名和端口號輸入

說明:測試要同步的存儲過程之一為[dbo].[sp_test01],它依賴于其他兩個對象:dbo.table01和dbo.fn_test01()

create proc [dbo].[sp_test01]
as
begin
 set no count on;
 delete from dbo.table01 where id = 1000
 select dbo.fn_test01()
end
標簽MSSQL,SQLServer,技術文檔,數據庫,SQLSERVER

相關下載

查看所有評論+

網友評論

網友
您的評論需要經過審核才能顯示

熱門閱覽

最新排行

公眾號

主站蜘蛛池模板: 欧美一区二区三区综合色视频| 蜜桃臀av高潮无码| 日韩影视在线观看| 国产一区日韩二区欧美三区| 一级特黄aaa大片在线观看| 男女性杂交内射女BBWXZ| 国产精品视频在| 九九视频在线观看视频23| 色欲精品国产一区二区三区AV | 久久久久亚洲av成人网人人软件| 老司机福利在线播放| 天天干天天色天天| 亚洲免费观看在线视频| 野花社区视频www| 好看的国产精彩视频 | 9久热精品免费观看视频| 欧美又大粗又爽又黄大片视频黑人| 国产女主播喷水视频在线观看| 中文字幕一区二区三区人妻少妇 | 亚洲人成网站999久久久综合| 韩国三级日本三级香港三级黄| 宝贝过来趴好张开腿让我看看 | 91视频综合网| 日韩欧美亚洲国产精品字幕久久久 | 宅男lu66国产在线播放| 亚洲日韩亚洲另类激情文学| 马浩宁高考考了多少分| 好爽好深好猛好舒服视频上| 亚洲人成网7777777国产| 色欲香天天天综合网站| 在线私拍国产福利精品| 久久精品国产99精品最新| 精品久久中文字幕有码| 国产精品一区二区久久精品涩爱 | 亚洲另类第一页| 色八a级在线观看| 国产高清免费观看| 久久久一本精品99久久精品66 | 在线观看特色大片免费网站| 久久精品国产精品亚洲精品| 男女混合的群应该取什么名字 |