階層型テーブルの操作

Pythonで学ぶデータベース入門

Jason Myers

Co-Author of Essential SQLAlchemy and Software Engineer

階層型テーブル

  • 自己参照の関係を持つ
  • よくある例:
    • 組織
    • 地理
    • ネットワーク
    • グラフ
Pythonで学ぶデータベース入門

階層型テーブル - 例

階層型テーブルの図

Pythonで学ぶデータベース入門

階層型テーブル - alias()

  • 同一テーブルを複数名で参照する仕組みが必要
  • 一意の参照を作り、利用できる
Pythonで学ぶデータベース入門

階層データのクエリ

managers = employees.alias()

stmt = select( [managers.columns.name.label('manager'), employees.columns.name.label('employee')])
stmt = stmt.select_from(employees.join( managers, managers.columns.id == employees.columns.manager)
stmt = stmt.order_by(managers.columns.name)
print(connection.execute(stmt).fetchall())
[(u'FILLMORE', u'GRANT'),
 (u'FILLMORE', u'ADAMS'),
 (u'HARDING', u'TAFT'), ...
Pythonで学ぶデータベース入門

group_by と func

  • group_by() は正しいエイリアスに適用することが重要
  • 関数の対象列に注意
  • クエリでテーブル名とエイリアスの両方を使わないなら、エイリアスは作らない
Pythonで学ぶデータベース入門

階層データのクエリ

managers = employees.alias()

stmt = select([managers.columns.name, func.sum(employees.columns.sal)])
stmt = stmt.select_from(employees.join( managers, managers.columns.id == employees.columns.manager)
stmt = stmt.group_by(managers.columns.name) print(connection.execute(stmt).fetchall())
[(u'FILLMORE', Decimal('96000.00')),
 (u'GARFIELD', Decimal('83500.00')),
 (u'HARDING', Decimal('52000.00')),
 (u'JACKSON', Decimal('197000.00'))]
Pythonで学ぶデータベース入門

演習に進みましょう!

Pythonで学ぶデータベース入門

Preparing Video For Download...