Pandasには、SQLのテーブルにデータフレームを書き込むことができる素晴らしい機能があります。Pandasを使用してMySQLでテンポラリテーブルを作成
df.to_sql(con=cnx, name='some_table_name', if_exists='replace', flavor='mysql', index=False)
このように、一時テーブルを作成する方法はありますか?
私が知る限り、ドキュメントには何もありません。
Pandasには、SQLのテーブルにデータフレームを書き込むことができる素晴らしい機能があります。Pandasを使用してMySQLでテンポラリテーブルを作成
df.to_sql(con=cnx, name='some_table_name', if_exists='replace', flavor='mysql', index=False)
このように、一時テーブルを作成する方法はありますか?
私が知る限り、ドキュメントには何もありません。
DataFrame.to_sql()
は、組み込みのパンダpandas.io.sql
packageを使用します。これ自体は、データベース抽象化レイヤーとしてSQLAlchemyに依存しています。私が見たものから、
t = Table(
't', metadata,
Column('id', Integer, primary_key=True),
# ...
prefixes=['TEMPORARY'],
)
、pandas.io.sql
does 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です。これは一種のハッキーですが、少なくともこのアプローチを開始するためのサンプルコードとして役立つことを願っています。
これはちょっとハッキリかもしれません。技術的には一時テーブルを作成するのではなく、ちょうどそのように動作しますが、@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で動作する限り、意図したとおりに動作するはずです。
'_create_table_setup'関数は、' table'プロパティを設定するために '__init__'でのみ呼び出されます。 'pandas.io.sql.SQLTable'でテーブルを作成するには、' create'を呼び出します。これは '_execute_create'を呼び出し、' table'プロパティを上書きします。だからあなたの試みはうまくいかなかったのです。代わりに、 '_execute_create'を編集する必要があります:https://gist.github.com/alecxe/44682f79b18f0c82a99c#gistcomment-2359365 –