LoginSignup
0
1

More than 1 year has passed since last update.

sqlalchemyでのORMを用いないinsertのやり方

Last updated at Posted at 2021-09-26

概要

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連携に関する日本語資料が増えるといいなと思いました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1