diadia

興味があることをやってみる。自分のメモを残しておきます。

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を使って動かしているようだ。