次のように、主キーを持つPandasのto_sql関数を使用してMySQLテーブルを作成したいと思います(通常、mysqlテーブルに主キーがあることは、一種の良いことです)。
group_export.to_sql(con = db, name = config.table_group_export, if_exists = 'replace', flavor = 'mysql', index = False)
ただし、これにより、主キーなしで(または、インデックスなしで)テーブルが作成されます。
ドキュメントでは、「index」パラメーターと組み合わせてインデックスを作成するために使用できるパラメーター「index_label」について言及していますが、主キーのオプションについては言及していません。
免責事項:この回答はより実験的で実用的ですが、言及する価値があります。
クラスにpandas.io.sql.SQLTable
は名前付き引数がkey
あり、それにフィールドの名前を割り当てると、このフィールドが主キーになることがわかりました。
残念ながら、この引数をDataFrame.to_sql()
関数から転送することはできません。それを使用するには:
pandas.io.SQLDatabase
インスタンスを作成する
engine = sa.create_engine('postgresql:///somedb')
pandas_sql = pd.io.sql.pandasSQL_builder(engine, schema=None, flavor=None)
内部で作成されたオブジェクトに渡されるpandas.io.SQLDatabase.to_sql()
追加の*kwargs
引数を使用して、それに類似した関数を定義しpandas.io.SQLTable
ます(元のto_sql()
メソッドをコピーして追加しました*kwargs
):
def to_sql_k(self, frame, name, if_exists='fail', index=True,
index_label=None, schema=None, chunksize=None, dtype=None, **kwargs):
if dtype is not None:
from sqlalchemy.types import to_instance, TypeEngine
for col, my_type in dtype.items():
if not isinstance(to_instance(my_type), TypeEngine):
raise ValueError('The type of %s is not a SQLAlchemy '
'type ' % col)
table = pd.io.sql.SQLTable(name, self, frame=frame, index=index,
if_exists=if_exists, index_label=index_label,
schema=schema, dtype=dtype, **kwargs)
table.create()
table.insert(chunksize)
SQLDatabase
インスタンスと保存するデータフレームでこの関数を呼び出します
to_sql_k(pandas_sql, df2save, 'tmp',
index=True, index_label='id', keys='id', if_exists='replace')
そして、私たちは次のようなものを得ます
CREATE TABLE public.tmp
(
id bigint NOT NULL DEFAULT nextval('tmp_id_seq'::regclass),
...
)
データベース内。
PSもちろん猿-パッチをすることができDataFrame
、io.SQLDatabase
かつio.to_sql()
機能利便性と、この回避策を使用します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加