У меня есть довольно большие pandas DataFrames, и я бы хотел использовать новые массовые сопоставления SQL для загрузки их на Microsoft SQL Server через SQL Alchemy. Метод pandas.to_sql, хотя и приятный, медленный.
У меня возникли проблемы с написанием кода...
Мне бы хотелось передать эту функцию pandas DataFrame, которую я вызываю table
, имя схемы, которую я вызываю schema
, и имя таблицы, которую я вызываю name
, В идеале, функция будет 1.) удалять таблицу, если она уже существует. 2.) создать новую таблицу 3.) создать картограф и 4.) объемную вставку с использованием данных mapper и pandas. Я застрял на третьей части.
Вот мой (правда, грубый) код. Я борюсь с тем, как заставить функцию mapper работать с моими первичными ключами. Мне действительно не нужны первичные ключи, но функция mapper требует этого.
Спасибо за понимание.
from sqlalchemy import create_engine Table, Column, MetaData
from sqlalchemy.orm import mapper, create_session
from sqlalchemy.ext.declarative import declarative_base
from pandas.io.sql import SQLTable, SQLDatabase
def bulk_upload(table, schema, name):
e = create_engine('mssql+pyodbc://MYDB')
s = create_session(bind=e)
m = MetaData(bind=e,reflect=True,schema=schema)
Base = declarative_base(bind=e,metadata=m)
t = Table(name,m)
m.remove(t)
t.drop(checkfirst=True)
sqld = SQLDatabase(e, schema=schema,meta=m)
sqlt = SQLTable(name, sqld, table).table
sqlt.metadata = m
m.create_all(bind=e,tables=[sqlt])
class MyClass(Base):
return
mapper(MyClass, sqlt)
s.bulk_insert_mappings(MyClass, table.to_dict(orient='records'))
return