Recommended
PDF
PlaySQLAlchemy: SQLAlchemy入門
PDF
PPTX
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PDF
さいきんの InnoDB Adaptive Flushing (仮)
PDF
PPTX
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
PPTX
PDF
Python 3.9からの新定番zoneinfoを使いこなそう
PPTX
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
PDF
Pacemaker + PostgreSQL レプリケーション構成(PG-REX)のフェイルオーバー高速化
PPTX
トランザクションをSerializableにする4つの方法
PPTX
大量時空間データの処理 ~ 現状の課題と今後OSSが解決すべきこと。(Open Source Conference 2021 Online/Osaka講演資料)
PDF
PDF
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PPTX
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
PPTX
PDF
AWS で Presto を徹底的に使いこなすワザ
PDF
PPTX
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PDF
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
PDF
PDF
ドキュメントを作りたくなってしまう魔法のツールSphinx
PDF
Docker入門 - 基礎編 いまから始めるDocker管理
PDF
PDF
PDF
More Related Content
PDF
PlaySQLAlchemy: SQLAlchemy入門
PDF
PPTX
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PDF
さいきんの InnoDB Adaptive Flushing (仮)
PDF
PPTX
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
PPTX
What's hot
PDF
Python 3.9からの新定番zoneinfoを使いこなそう
PPTX
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
PDF
Pacemaker + PostgreSQL レプリケーション構成(PG-REX)のフェイルオーバー高速化
PPTX
トランザクションをSerializableにする4つの方法
PPTX
大量時空間データの処理 ~ 現状の課題と今後OSSが解決すべきこと。(Open Source Conference 2021 Online/Osaka講演資料)
PDF
PDF
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PPTX
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
PPTX
PDF
AWS で Presto を徹底的に使いこなすワザ
PDF
PPTX
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PDF
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
PDF
PDF
ドキュメントを作りたくなってしまう魔法のツールSphinx
PDF
Docker入門 - 基礎編 いまから始めるDocker管理
PDF
Similar to PlaySQLAlchemyORM2017.key
PDF
PDF
PDF
PDF
PPTX
【修正版】Django + SQLAlchemy: シンプルWay
PDF
PDF
PDF
PDF
PDF
PDF
PPT
PDF
Shizuokapy4_データヴィジュアライズのための簡単なWeb API開発まめ知識
PDF
MariaDB migration from commercial database
PDF
Integral - New O/R Mapper for Common Lisp
PDF
PDF
Getting started MySQL as Document Data Store
PDF
PDF
Aniki - The ORM as our great brother.
More from 泰 増田
PDF
PPTX
PPT
PPT
Python languageupdate (2004)
PPTX
Robot Framework (のSelenium2Libraryのお話)
PDF
PDF
wxPython入門(大阪Pythonユーザの集まり2014/03)
PlaySQLAlchemyORM2017.key 1. 2. Yasushi Masuda PhD
( @whosaysni )
Tech team, Core IT grp. IT Dept.
MonotaRO Co., LTD.
Pythonista since 2001 (2.0~)
• elaphe (barcode library)
• oikami.py (老神.py)
• PyCon JP founder
翻訳もろもろ
3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. セッション
Program
query A SELECT A
record Aobject A
start
tracking A
...
(updates) flag A as
"dirty"
reflect new/dirty
changes
flush()
start
tracking B
...
add(b)
UPDATE A
INSERT B
COMMIT
BEGIN
(create) Database
(new object)
commit()
18. 19. 20. 21. 22. # 自動マッピングベースクラスを生成
>>> from sqlalchemy.ext.automap import automap_base
>>> Base = automap_base()
# エンジンを指定してテーブル情報を反映させる
>>> Base.prepare(engine=e, reflect=True)
2017-10-01 07:37:18,014 INFO sqlalchemy.engine.base.Engine SELECT CAST ....
...
2017-10-01 07:37:18,019 INFO sqlalchemy.engine.base.Engine SELECT name FROM sqlite_master WHERE type='table' ORDER BY name
2017-10-01 07:37:18,019 INFO sqlalchemy.engine.base.Engine ()
2017-10-01 07:37:18,021 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("actor")
2017-10-01 07:37:18,022 INFO sqlalchemy.engine.base.Engine ()
2017-10-01 07:37:18,023 INFO sqlalchemy.engine.base.Engine SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL
SELECT * FROM sqlite_temp_master) WHERE name = 'actor' AND type = 'table'
2017-10-01 07:37:18,023 INFO sqlalchemy.engine.base.Engine ()
2017-10-01 07:37:18,024 INFO sqlalchemy.engine.base.Engine PRAGMA foreign_key_list("actor")
2017-10-01 07:37:18,024 INFO sqlalchemy.engine.base.Engine ()
2017-10-01 07:37:18,024 INFO sqlalchemy.engine.base.Engine SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL
SELECT * FROM sqlite_temp_master) WHERE name = 'actor' AND type = 'table'
2017-10-01 07:37:18,024 INFO sqlalchemy.engine.base.Engine ()
2017-10-01 07:37:18,026 INFO sqlalchemy.engine.base.Engine PRAGMA index_list("actor")
2017-10-01 07:37:18,026 INFO sqlalchemy.engine.base.Engine ()
...
>>> list(Base.classes) # テーブルが読み込めている
[<class 'sqlalchemy.ext.automap.category'>, <class 'sqlalchemy.ext.automap.city'>, <class 'sqlalchemy.ext.automap.store'>,
<class 'sqlalchemy.ext.automap.film_text'>, <class 'sqlalchemy.ext.automap.language'>, <class
'sqlalchemy.ext.automap.country'>, <class 'sqlalchemy.ext.automap.actor'>, <class 'sqlalchemy.ext.automap.film_category'>,
<class 'sqlalchemy.ext.automap.customer'>, <class 'sqlalchemy.ext.automap.film_actor'>, <class
'sqlalchemy.ext.automap.inventory'>, <class 'sqlalchemy.ext.automap.address'>, <class 'sqlalchemy.ext.automap.staff'>,
<class 'sqlalchemy.ext.automap.rental'>, <class 'sqlalchemy.ext.automap.payment'>, <class 'sqlalchemy.ext.automap.film'>,
<class 'sqlalchemy.ext.automap.location'>]
>>>
automappingを使ってみましょう
(ベースクラスの準備)
↓テーブル一覧を取得
テーブルの情報を取得
23. # Base.classes は(自動的に作られた)テーブル名でアクセスできる
>>> Film = Base.classes.film
>>> Film
<class 'sqlalchemy.ext.automap.film'>
# Filmクラスはマッピング済み
>>> dir(Film)
['__abstract__', '__class__', ... , 'description', 'film_id', 'language',
'language_id', 'last_update', 'length', 'metadata',
'original_language_id', 'prepare', 'rating', 'release_year',
'rental_duration', 'rental_rate', 'replacement_cost', 'special_features',
'title']
# スキーマ定義もできている
>>> Film.__table__
Table('film', MetaData(bind=None),
Column('film_id', INTEGER(), table=<film>, primary_key=True, ...),
Column('title', VARCHAR(length=255), table=<film>, nullable=False), ...)
>>>
automappingを使ってみましょう
(マッピングクラスを参照する)
24. 25. 26. 27. 28. 29. 30. 31. オブジェクトの値にアクセスしましょう
(オブジェクトの中身)
>>> f = q.first
# オブジェクトにはテーブルのカラムと同じ名前のアトリビュート
がある
# language_id だけでなく lanugage というアトリビュートがある
# _collection のついた怪しげなアトリビュートもある
>>> dir(f)
[..., 'description', 'film_actor_collection',
'film_category_collection', 'film_id',
'inventory_collection', 'language', 'language_id',
'last_update', 'length', 'metadata', 'original_language_id',
'prepare', 'rating', 'release_year', 'rental_duration',
'rental_rate', 'replacement_cost', 'special_features',
'title']
32. オブジェクトの値にアクセスしましょう
(カラム値にアクセスする)
# カラム名のアトリビュートから値にアクセスできる
>>> f.title
'ACADEMY DINOSAUR'
# カラムのデータ型に応じて適切なPythonデータ型になる
>>> [f.title, f.length, f.rental_rate, f.last_update]
['ACADEMY DINOSAUR', 86, Decimal('0.99'),
datetime.datetime(2011, 9, 14, 18, 5, 32)]
33. 34. 35. 36. オブジェクトの値を更新しましょう
(リレーションの更新)
# リレーションのアトリビュートに代入すると、値をセットできる
# 代入するのはマッピングクラスのインスタンス
>>> Language = Base.classes.language
>>> lang = session.query(Language).get(2)
>>> lang.id, lang.name
(2, 'Italian')
>>> f.language_id, f.language.language_id, f.name
(1, 1, 'English')
>>> f.lanugage = lang
# 注意: language_id は変更されない!
# flush() してはじめて外部キーが更新される
>>> f.language_id, f.language.language_id, f.name
(1, 2, 'Italian')
>>> session.flush()
>>> f.language_id, f.language.language_id, f.name
(2, 2, 'Italian')
#### 大事なこと:リレーションを更新したら必ず flush() する
37. 38. オブジェクトを新規追加しましょう
# カラムの値をキーワードパラメタで渡してオブジェクトを生成する
>>> Language(language_id=99, name='Japanese', last_update=datetime.now())
<sqlalchemy.ext.automap.language object at 0x103243f60>
>>> l = Language(language_id=99, name='Japanese', last_update=datetime.now())
# セッションに追加すると新規追加対象になる
>>> s.add(l)
# セッションを flush() すると INSERT 文が実行される
>>> s.flush()
2017-10-02 07:12:26,651 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2017-10-02 07:12:26,652 INFO sqlalchemy.engine.base.Engine INSERT INTO
language (language_id, name, last_update) VALUES (?, ?, ?)
2017-10-02 07:12:26,652 INFO sqlalchemy.engine.base.Engine (99, 'Japanese',
'2017-10-02 07:12:12.932744')
>>>
39. 40. 41. 42. 43.