Работа с иерархическими таблицами

Введение в базы данных на Python

Jason Myers

Co-Author of Essential SQLAlchemy and Software Engineer

Иерархические таблицы

  • Содержат связь с самими собой
  • Часто встречаются в:
    • Организационных
    • Географических
    • Сетевых
    • Графовых
Введение в базы данных на Python

Иерархические таблицы — пример

hierarchical_table.jpg

Введение в базы данных на 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...