migration.py 2.7 KB
# 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()