Python做sql server和mysql之間的資料傳輸
H**Online Syn**avigator倒閉了,王八蛋老闆XX沉迷於吃雞,還有2000+的BUG沒有修復,就帶著他的小姨子跑路了,我們碼農沒辦法,只能用python來自己開發一個數據同步程式應急。什麼詭異的第三方庫都不要,統統可以 pip,只要你用python 3。x,就可以很快搞出這個同步程式。
罵完,開工!
開發機環境:
python 3。6。x
windows 10
生產環境:
CentOS 7。2
python 3。6。x
選擇 python 3。x 的理由:
1。 Python 2。x 將於2020年完成歷史使命
2。 Python 3。x 採用的是 unicode 編碼,亂碼問題不存在的!
原理
原理簡單到令人髮指:
從源資料庫中讀取資料
寫入到目標資料庫
沒了。
需要注意的坑:
字元編碼問題,弄不好中文就出亂碼了。
字元長度問題。
開工前的配置:
pip install pymysql
pip install pymssql
pip install ConfigParser
在 python 3。x 中,ConfigParser被改名為configparser,參考:
程式碼實現
假設你有個資料庫在mysql上,有個資料庫在sql server上。你需要同步 users 表的資料(兩個資料庫的users表的資料結構完全相同),可以這樣:
資料庫配置檔案
作為一個有經驗的開發者,是一定不會把資料庫的配置放到每個程式原始碼中的。這裡我們建立了一個叫做 database。config 的配置檔案來保持資料庫的配置:
[DATABASE_CONFIG_A]
database=database_name
host=database_host_ip_address
user=database_user_login_id
password=database_user_password
[DATABASE_CONFIG_B]
database=database_name
host=database_host_ip_address
user=database_user_login_id
password=database_user_password
以上的引數,請大家自己按照自己的實際情況配置成自己的引數。
2. 資料遷移程式
import
pymssql
import
pymysql
import
configparser
def
getDbConfig
(
filename
,
section
):
config_parser
=
configparser
。
ConfigParser
()
config_parser
。
read
(
filename
)
database
=
config_parser
。
get
(
section
,
‘database’
)
host
=
config_parser
。
get
(
section
,
‘host’
)
user
=
config_parser
。
get
(
section
,
‘user’
)
password
=
config_parser
。
get
(
section
,
‘password’
)
config
=
{
‘database’
:
database
,
‘host’
:
host
,
‘user’
:
user
,
‘password’
:
password
}
return
config
def
insertData
(
rs
):
config
=
getDbConfig
(
‘database。config’
,
‘DB_SQLSERVER’
)
conn
=
pymssql
。
connect
(
host
=
config
。
get
(
‘host’
),
user
=
config
。
get
(
‘user’
),
password
=
config
。
get
(
‘password’
),
database
=
config
。
get
(
‘database’
),
charset
=
‘utf8’
)
cursor
=
conn
。
cursor
()
for
row
in
rs
:
sql
=
‘INSERT INTO users (name, lastupdated_at) VALUES(
%s
,
%s
)’
cursor
。
execute
(
sql
,
(
row
[
0
],
row
[
1
]))
# 如果不同,可以在這裡做小的處理
conn
。
commit
()
conn
。
close
()
mysqlConfig
=
getDbConfig
(
‘database。config’
,
‘DB_MYSQL’
)
mysqlConn
=
pymysql
。
connect
(
host
=
mysqlConfig
。
get
(
‘host’
),
user
=
mysqlConfig
。
get
(
‘user’
),
password
=
mysqlConfig
。
get
(
‘password’
),
database
=
mysqlConfig
。
get
(
‘database’
),
charset
=
‘utf8’
)
#檢視連線是否成功
mysqlCursor
=
mysqlConn
。
cursor
()
sql
=
‘SELECT name, lastupdated_at FROM users’
mysqlCursor
。
execute
(
sql
)
#用一個rs變數獲取資料
rs
=
mysqlCursor
。
fetchall
()
mysqlCursor
。
close
()
insertData
(
rs
)
這樣,一個從 mysql 讀取資料,並寫入 Sql Server 的資料傳輸程式就完成了。
有待完善的地方
這個程式並不完美,比如我並沒有考慮加入異常捕捉機制和日誌機制。
如果要自動,定時的傳輸,可以利用windows的計劃任務或者CentOS(Linux)的 cron 來實現。這個可以自己百度了。
從上面的例子可以看出,python確實在某些應用上非常強大,簡直是神器。
參考資料
pymssql官網
python的ConfigParser模組