使用 SQLAlchemy 跨服务器/引擎从选择插入到表

Insert into table from select across servers/engines using SQLAlchemy

提问人:carbonchauvinist 提问时间:11/13/2023 更新时间:11/13/2023 访问量:33

问:

我正试图找出解决这个问题的最佳方法。

从根本上说,目标是将表从一台服务器/数据库复制到另一台服务器/数据库。因此,我有两个引擎,一个用于源,一个用于目标。

# create source connection
source_engine: Engine = create_engine(
    f"mssql+pyodbc://{source_server}/{source_database}?driver=ODBC Driver 17 for SQL Server",
    fast_executemany=True,
    echo=True,
    logging_name="source_engine",
)

# instantiate MetaData object to hold source schema/table/view info
source_metadata: MetaData = MetaData()

destination_engine: Engine = create_engine(
    f"mssql+pyodbc://{destination_server}/{destination_database}?driver=ODBC Driver 17 for SQL Server",
    fast_executemany=True,
    echo=True,
    logging_name="destination_engine",
)

destination_metadata: MetaData = MetaData(schema=destination_schema)

我正在尝试以下操作:

  1. 使用选项将源表反映到表对象中autoload_with
source_object: Table = Table(
    source_object_name,
    source_metadata,
    autoload_with=source_engine,
    schema=source_schema,
)
  1. 使用该方法将源表复制到新的表对象中,更改架构等to_metadata

destination_object: Table = source_object.to_metadata(destination_metadata, schema=None)

  1. 在目标服务器中创建目标表

destination_object.create(destination_engine)

目前为止,一切都好。现在,我们在目标目标中设置了一个匹配的表。

现在的绊脚石 -- 移动数据。

理想情况下,我想做的是在一些伪代码中使用如下所示的内容:insert(destination_object).from_select(list_of_columns, select(source_object))

但是我不知道如何在源引擎中运行select和在目标引擎中运行insert。

任何想法将不胜感激。

目前,我已经尝试了,首先将数据提取到数据帧中,然后使用它放入目标表中。

df: pd.DataFrame = pd.read_sql(
    f"SELECT * FROM {source_schema}.{source_object_name}", source_engine
)

# convert the df to a list of dicts like [{column -> value}, … , {column -> value}]
list_of_dicts: list[dict] = df.to_dict("records")

# create the insert construct against the destination table
ins = destination_object.insert()

# create context manager and insert records into the destination table
with destination_engine.begin() as conn:
    conn.execute(ins, list_of_dicts)

python sql-server sqlalchemy

评论

0赞 Gord Thompson 11/13/2023
“求助于首先将数据拉入 DataFrame,然后使用该数据放入目标表” - 使用两个独立的引擎(因此有两个单独的连接),您需要执行类似操作。否则,您需要设置链接服务器或使用 OPENROWSET,但默认情况下禁用“即席分布式查询”,因此您可能需要让管理员启用它们。

答: 暂无答案