2015-12-10 25 views
5

Pandasには、SQLのテーブルにデータフレームを書き込むことができる素晴らしい機能があります。Pandasを使用してMySQLでテンポラリテーブルを作成

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

このように、一時テーブルを作成する方法はありますか?

私が知る限り、ドキュメントには何もありません。

答えて

5

DataFrame.to_sql()は、組み込みのパンダpandas.io.sql packageを使用します。これ自体は、データベース抽象化レイヤーとしてSQLAlchemyに依存しています。私が見たものから、

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

pandas.io.sqldoes not allow you to specify the prefixesまたは簡単にはテーブルが作成されている方法を変更:SQLAlchemyのORM、you need to supply a prefixに「一時的な」テーブルを作成するために。この問題にアプローチする

一つの方法は、事前を一時テーブルを作成し(全て同一のデータベース接続を使用して)if_exists="append"to_sql()を使用となるであろう。 pandas.io.sql.SQLTable_create_table_setup()メソッドをオーバーライドし、Tableコンストラクタにprefixesを渡します。ここでは


は私がしようとした何もです。なんらかの理由で、テーブルは非一時的に作成されました。それが助けになるかどうかはわかりませんが、私が使っていたコードはgistです。これは一種のハッキーですが、少なくともこのアプローチを開始するためのサンプルコードとして役立つことを願っています。

+1

'_create_table_setup'関数は、' table'プロパティを設定するために '__init__'でのみ呼び出されます。 'pandas.io.sql.SQLTable'でテーブルを作成するには、' create'を呼び出します。これは '_execute_create'を呼び出し、' table'プロパティを上書きします。だからあなたの試みはうまくいかなかったのです。代わりに、 '_execute_create'を編集する必要があります:https://gist.github.com/alecxe/44682f79b18f0c82a99c#gistcomment-2359365 –

0

これはちょっとハッキリかもしれません。技術的には一時テーブルを作成するのではなく、ちょうどそのように動作しますが、@contextmanager decorator from contextlibを使用してコンテキストを開いて閉じるときにテーブルを作成できます。

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" 

私はTeradataを使ってテストしましたが、うまくいきました。私はそれを試すことができるMySQLを用意していませんが、DROPの文がMySQLで動作する限り、意図したとおりに動作するはずです。

関連する問題