Może to być trochę hackowate i nie tworzy on technicznie tabeli tymczasowej, po prostu działa jak jeden, ale można utworzyć, korzystając z @contextmanager
decorator from contextlib
, aby utworzyć tabelę po otwarciu kontekstu i upuścić go z bliska. Mogło wyglądać mniej więcej:
from contextlib import contextmanager
import numpy as np
import sqlalchemy as sqla
import pandas as pd
@contextmanager
def temp_table(frame, tbl, eng, *args, **kwargs):
frame.to_sql(tbl, eng, *args, **kwargs)
yield
eng.execute('DROP TABLE {}'.format(tbl))
df = pd.DataFrame(np.random.randint(21, size=(10, 10)))
cnx = sqla.create_engine(conn_string)
with temp_table(df, 'some_table_name', cnx, if_exists='replace', flavor='mysql', index=False):
# do stuff with "some_table_name"
Przetestowałem go za pomocą Teradata i działa dobrze. Nie mam kodem MySQL, na którym mogę go przetestować, ale tak długo jak instrukcje DROP
działają w MySQL, powinien działać tak, jak powinien.
Funkcja '_create_table_setup' jest wywoływana tylko w' __init__', aby ustawić właściwość 'table'. Aby utworzyć tabelę z 'pandas.io.sql.SQLTable', wywołujesz' create', który wywołuje '_execute_create', który nadpisuje właściwość' table'. Dlatego twoja próba nie zadziałała. Zamiast tego musisz edytować "_execute_create": https://gist.github.com/alecxe/44682f79b18f0c82a99c#gistcomment-2359365 –