SQL Serverのあるデータベースから別のデータベースに多数のテーブル(約100テーブル)をコピーできる優れたPythonコードを知っている人はいますか?
私の職場の制限により、SQL Server内のデータベース間でテーブルをコピーすることはできないため、Pythonでそれを行う方法があるかどうかを尋ねます。
これは、あるデータベースから別のデータベースに1つのテーブルをコピーする単純なPythonコードです。100個のテーブルをコピーする場合、それを記述するためのより良い方法があるかどうか疑問に思っています。
print('Initializing...')
import pandas as pd
import sqlalchemy
import pyodbc
db1 = sqlalchemy.create_engine("mssql+pyodbc://user:password@db_one")
db2 = sqlalchemy.create_engine("mssql+pyodbc://user:password@db_two")
print('Writing...')
query = '''SELECT * FROM [dbo].[test_table]'''
df = pd.read_sql(query, db1)
df.to_sql('test_table', db2, schema='dbo', index=False, if_exists='replace')
print('(1) [test_table] copied.')
SQLAlchemyは、実際には2番目のデータベースに同一のテーブルを作成するために使用するのに適したツールです。
table = Table('test_table', metadata, autoload=True, autoload_with=db1)
table.create(engine=db2)
このメソッドは、正しいキー、インデックス、外部キーも生成します。必要なテーブルが作成されたら、テーブルが比較的小さい場合は選択/挿入するか、bcpユーティリティを使用してテーブルをディスクにダンプしてから、2番目のデータベースにロードすることでデータを移動できます(はるかに高速ですが、取得するための作業が増えます正しく動作します)
選択/挿入を使用する場合は、500レコード程度のバッチで挿入することをお勧めします。
あなたはこのようなことをすることができます:
tabs = pd.read_sql("SELECT table_name FROM INFORMATION_SCHEMA.TABLES", db1)
for tab in tabs['table_name']:
pd.read_sql("select * from {}".format(tab), db1).to_sql(tab, db2, index=False)
しかし、それはひどく遅いかもしれません。このジョブを実行するには、SQLServerツールを使用します。
sp_addlinkedserver プロシージャを使用して、あるSQLServerを別のSQLServerからリンクすることを検討してください。その後、以下を実行できます。
SELECT * INTO server_name...table_name FROM table_name
db1
データベースのすべてのテーブル。
PSこれはPython + SQLAlchemyでも実行される可能性があります...