SQLAlchemy
参考文献:https://it-engineer-lab.com/archives/1183
sqlite3とdjangoのmodelsとSQLalchemyの共通点と差異についてメモできるとよい。
sqliteはそもそもすべてのデータをテキストのデータとして保存している。。。?
https://blog.ohgaki.net/sqlite-data-type-specification
データ型について
floatとdecimal
https://docs.sqlalchemy.org/en/latest/core/type_basics.html#sqlalchemy.types.Float
floatとdecimalはFloatを使って表現する。
Floatのasdecimal=Trueに設定した場合にDecimalとなる。
djangoの場合は
TextFieldがあるけどこれはどうなっているのか。
SQLAlchemyの場合でもTextがあるようだ。
djangoの場合はDecimalFieldで登録していたけど、
sqlite3は便宜的にIntegerにしてた。これは問題ないか?
sqlalchemyの場合は、Floatでasdecimal=Trueにすればdecimalが使える。
モデルの作成について
分かったこと。 データベースのテーブルデータを呼び出すためにモデルの作成がある。
例えばsqlite3のテーブルデータを呼び出すには、sqlite3のテーブルを自分で作成する必要がある。
その作り方はBaseモデルを継承して呼び出したいテーブルに似せたものを作る。この工程はdjangoのテーブルを作成する方法に似ている。
from sqlalchemy.ext.declarative import declarative_base # まずベースモデルを生成します Base = declarative_base() # 次にベースモデルを継承してモデルクラスを定義します class Product(Base): __tablename__ = 'mydb' title = Column(String(255)) description = Column(Text) price = Column(Integer)
わかったことは実際にテーブルに存在しないアトリビュートをモデルクラスとして定義すると、エラーが出てしまう。したがってテーブルのカラム名を正確に記述しなければいけない。
CRUDについて
SQL文の実行においてsqlite3でcur.execute()メソッドを使う。
SQLAlchemyの場合はsession.[sessionのメソッド名]()という形で行う。
例えば以下のようになる。
- add() -- INSERT
- query() -- SELECT
- filter() -- WHERE
ドキュメント(チュートリアル)
https://www.pythoncentral.io/migrate-sqlalchemy-databases-alembic/
sqlalchemyはAlembicを使って動かしているようだ。