migration.py
2.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# coding=utf-8
#author: 4N
#createtime: 2022/2/23
#email: nheweijun@sina.com
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker,Session
from osgeo import ogr
from osgeo.ogr import *
class Migration():
dmap_dms_ds = None
dmap_server_ds = None
dmap_manager_ds = None
def __init__(self,dmap_dms_db,dmap_server_db,dmap_manager_db):
self.dmap_dms_ds : DataSource = self.open_pg_data_source(dmap_dms_db)
self.dmap_server_ds: DataSource = self.open_pg_data_source(dmap_server_db)
self.dmap_manager_ds: DataSource = self.open_pg_data_source(dmap_manager_db)
def process(self):
self.dmap_dms_migration()
self.dmap_server_migration()
def dmap_dms_migration(self):
database:Layer = self.dmap_dms_ds.ExecuteSQL('select * from "dmdms_database" ')
self.dmap_manager_ds.CopyLayer(database,"dmap_database",["OVERWRITE=YES"])
def dmap_server_migration(self):
pass
def end(self):
if self.dmap_dms_ds:
self.dmap_dms_ds.Destroy()
if self.dmap_server_ds:
self.dmap_server_ds.Destroy()
if self.dmap_manager_ds:
self.dmap_manager_ds.Destroy()
def open_pg_data_source(self,uri):
"""
# 获取PostGIS数据源
:return:
"""
db_conn_tuple = self.get_info_from_sqlachemy_uri(uri)
fn = "PG: user=%s password=%s host=%s port=%s dbname=%s " % db_conn_tuple
driver = ogr.GetDriverByName("PostgreSQL")
if driver is None:
raise Exception("打开PostgreSQL驱动失败,可能是当前GDAL未支持PostgreSQL驱动!")
ds = driver.Open(fn, 1)
if ds is None:
raise Exception("打开数据源失败!")
return ds
def get_info_from_sqlachemy_uri(self,uri):
parts = uri.split(":")
user = parts[1][2:]
password_list = parts[2].split("@")
if password_list.__len__() > 2:
password = "@".join(password_list[:-1])
else:
password = parts[2].split("@")[0]
host = parts[2].split("@")[-1]
port = parts[3].split("/")[0]
database = parts[3].split("/")[1]
return user, password, host, port, database
if __name__ == '__main__':
dmap_dms_db = "postgresql://postgres:chinadci@172.26.60.100:5432/dmap_dms"
dmap_server_db = "postgresql://postgres:chinadci@172.26.60.100:5432/DmapServer"
dmap_manager_db = "postgresql://postgres:chinadci@172.26.60.100:5432/migration"
migration = Migration(dmap_dms_db,dmap_server_db,dmap_manager_db)
migration.process()
migration.end()