2015-12-10 14 views
5

Pandas ha una grande funzionalità, dove puoi scrivere il tuo dataframe su una tabella in SQL.Crea una tabella temporanea in MySQL usando Pandas

df.to_sql(con=cnx, name='some_table_name', if_exists='replace', flavor='mysql', index=False)

C'è un modo per fare una tabella temporanea in questo modo?

Non c'è nulla nella documentazione per quanto posso dire.

risposta

5

Il DataFrame.to_sql() utilizza il built in panda pandas.io.sql package, che a sua volta si basa su SQLAlchemy come livello di astrazione del database. Al fine di creare una tabella "temporanea" in SQLAlchemy ORM, you need to supply a prefix:

t = Table(
    't', metadata, 
    Column('id', Integer, primary_key=True), 
    # ... 
    prefixes=['TEMPORARY'], 
) 

Da quello che vedo, pandas.io.sqldoes not allow you to specify the prefixes o facilmente cambiare il modo in cui vengono create le tabelle.

Un modo per affrontare questo problema sarebbe quello di creare la tabella temporanea in anticipo e utilizzare to_sql() con if_exists="append" (tutto utilizzando la stessa connessione al database).


Anche qui è quello che ho cercato di fare: ignorare il metodo 's il pandas.io.sql.SQLTable_create_table_setup() e passare il prefixes al costruttore Table. Per qualche motivo, la tabella è stata ancora creata non temporanea. Non sono sicuro se sarebbe di aiuto, ma qui è il codice che stavo usando: gist. Questo è un po 'hacky, ma spero che servirebbe almeno da codice di esempio per iniziare con questo approccio.

+1

La funzione '_create_table_setup' è chiamata solo in' __init__' per impostare la proprietà 'table'. Per creare una tabella con 'pandas.io.sql.SQLTable', si chiama' create', che chiama '_execute_create', che sovrascrive la proprietà' table'. Ecco perché il tuo tentativo non ha funzionato. Invece, devi modificare '_execute_create': https://gist.github.com/alecxe/44682f79b18f0c82a99c#gistcomment-2359365 –

0

Questo può essere un po 'hacky e tecnicamente non crea una tabella temporanea, si comporta come una sola, ma è possibile creare l'uso di @contextmanager decorator from contextlib per creare la tabella all'apertura del contesto e rilasciarla alla chiusura. Potrebbe sembrare qualcosa di simile:

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" 

L'ho provato usando Teradata e funziona perfettamente. Non ho un MySQL in giro su cui posso provarlo, ma finché le istruzioni DROP funzionano in MySQL, dovrebbe funzionare come previsto.

Problemi correlati