##概要
ORM使わないsqlalchemyでのINSERTに関する日本語記事を見つけられず、
色々組み合わせてとりあえずで動かせたので、やり方を晒します。
##環境について
Python 2.7.16
SQLAlchemy 1.4.23
pandas 1.3.3
mysql 8
##sqlalchemyでobject定義をせずにinsertするまでのコード
from sqlalchemy import create_engine
from sqlalchemy import MetaData
from sqlalchemy import insert
dbengine = create_engine('mysql+mysqlconnector://' + MYSQL_ID + ':' + MYSQL_PASS + '@' + MYSQL_IP + ':' + MYSQL_PORT + '/' + MYSQL_DB)
dbmetadata = MetaData()
dbmetadata.reflect(bind=dbengine)
# MetaDataオブジェクトからテーブル定義を取得します。
# testtableは実際はORMで定義されたオブジェクトのインスタンスと同等のインスタンスかと思われます。
# テーブル名はTEST_TABLEです。
testtable = dbmetadata.tables['TEST_TABLE']
# 後はORMでやるやり方と同様にインスタンス渡してinsertすればよいかと。
# 以降は割と雑です。動かなければ、「sqlalchemy insert」とかで検索すれば幸せになれるかと思います。
insertstmt = (testtable).insert().values([column1:'value1', column2:'column2'])
dbengine.execute(insertstmt)
Selectとは異なり、Insert時にはテーブルを定義したオブジェクトのインスタンスがないと動作しないっぽいです。
ただ、MetaDataを利用してインスタンスが取得できます。
このため、ORMのようにオブジェクトをわざわざ定義しなくて良いのは楽。
##DataFrameをInsertするやり方
df.to_sql('TEST', dbengine, if_exists='replace', index=False)
既に情報の多い内容ですし、雑に書かせて頂きます。
さて、DataFrameでの定義時にはテーブルオブジェクトのインスタンスを引数としていませんが・・・
これを動かすと、insertというよりcreate tableな動きをします。
カラム名はDataFrameの行名で作成されます。
用途としては、一時的にDBへ登録、一時テーブルから実際のテーブルへ登録していく、な使い方が良いのかと考えます。
##sqlalchemyについての感想
sqlalchemyの特徴的なことはORMとしても使えますが、
Object RDB Mapper
としてだけではなく、
DataFrame RDB Mapper ※造語です
として使えることが特徴かと考えますし、
Python自体もデータの取り扱いに優れた言語ということもあり、
ORMだけではなく、
DataFrame連携に関する日本語資料が増えるといいなと思いました。