提问人:carbonchauvinist 提问时间:11/13/2023 更新时间:11/13/2023 访问量:33
使用 SQLAlchemy 跨服务器/引擎从选择插入到表
Insert into table from select across servers/engines using SQLAlchemy
问:
我正试图找出解决这个问题的最佳方法。
从根本上说,目标是将表从一台服务器/数据库复制到另一台服务器/数据库。因此,我有两个引擎,一个用于源,一个用于目标。
# 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)
我正在尝试以下操作:
- 使用选项将源表反映到表对象中
autoload_with
source_object: Table = Table(
source_object_name,
source_metadata,
autoload_with=source_engine,
schema=source_schema,
)
- 使用该方法将源表复制到新的表对象中,更改架构等
to_metadata
destination_object: Table = source_object.to_metadata(destination_metadata, schema=None)
- 在目标服务器中创建目标表
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)
答: 暂无答案
评论