Понимание MetaData() из SQLAlchemy в Python

Я пытаюсь понять, что объект MetaData() по сути. Используется при отражении и создании баз данных в Python (с использованием пакета SQLAlchemy).

Рассмотрим следующий рабочий код:

/ с предварительно загруженным движком (sqlite:///chapter5.sqlite) и метаданными = MetaData(): когда я вызываю метаданные в консоли, он возвращает "MetaData(bind=None)" /

# Import Table, Column, String, and Integer
from sqlalchemy import Table, Column, String, Integer

# Build a census table: census
census = Table('census', metadata,
               Column('state', String(30)),
               Column('sex', String(1)),
               Column('age', Integer()),
               Column('pop2000', Integer()),
               Column('pop2008',Integer()))

# Create the table in the database
metadata.create_all(engine)

Конечно, набрав тип (метаданные), я получаю именно тот тип метаданных объекта: sqlalchemy.sql.schema.MetaData. В документации SQLAlchemy написано

MetaData - это контейнерный объект, который объединяет в себе множество описываемых функций базы данных (или нескольких баз данных).

Однако я запутался, потому что в коде мы только создаем таблицу, которая "указывает" на метаданные. После этого, когда мы вызываем метод create_all для метаданных (пока что пустых), мы указываем на базу данных (на которую указывает движок).

Возможно, мой вопрос глуп, но:

Как Python точно соединяет эти экземпляры? Возможно, объявление таблицы переписи связывает метаданные с именами столбцов двусторонним способом.


Примечание. Код взят из упражнения из курса datacamp.

1 ответ

Решение

Я думаю, что вы спросили, как python (вероятно, вы имеете в виду SQLAlchemy) связывает таблицу с метаданными, а метаданные - с базой данных и механизмом.

Таким образом, таблицы базы данных в SQLAlchemy принадлежат (связаны с) объекту метаданных. Таблица добавляет себя в метаданные; у объекта метаданных есть свойство таблиц, которое во многом похоже на список:

rue, nullable = False), Column ('host_id', Integer(), ForeignKey ('slots.id'), table=, nullable=False), Column ('active', Boolean (), table =), столбец ('port', Integer(), table=, nullable=False), Column('description', String(length=120), table=), Column('username', String(length=40), tab le=), Столбец ("пароль", строка (длина = 40), таблица =), схема = нет), "network_location_associations": таблица ("network_location_associations", M etaData(bind=None), столбец ("network_id", Integer(), ForeignKey('networks.id'), table=), Column('location_id', Integer(), ForeignKey('location. id'), table=), schema=None), 'machines': Table('machines', MetaData(bind=None), столбец ('id', Integer(), ForeignKey (' items.id '), table =

, primary_key = True, nullable = False), Column ('eth0', String (), table =), Column ('eth1', String (), table =), Column ('eth2', String (), table =), Colu mn ('eth3', String (), table =), Column ('wlan0', String (), table =), Column ('ipmi', String (), table =), схема = нет), 'machine_profiles': таблица ('mach ine_profiles', метаданные (bind = None), столбец ('id', Integer(), table=, primary_key=True, nullable=False), столбец ('DisplayPort', Integer(), таблица =), столбец ("HDMI", Integer(), таблица =), столбец ("RAM", строка (длина =10), таблица =), схема = нет), "геометрия": таблица ("геометрия", Метаданные (b ind = None), столбец ('slot_id', Integer(), ForeignKey('slots.id'), table=, primary_key=True, nullable=False), столбец ('room_id', Integer(), ForeignKey('rooms.id'), tabl e=, nullable=False), столбец ('x_mm', Float(), table=, nullable=False), столбец ('y_mm', Float(), table=, nullable=False), столбец ('z_mm', Float(), t able=, nullable=False), Column('вращение_deg', Float(), table=, nullable=False), столбец ('tilt_deg', Float(), таблица =, nullable=False), Column('ro ll_deg', Float(), table=, nullable=False), Column('on_floor', Boolean(), table=, nullable=False), схема = Нет), 'publicaddresses': Table('publicaddresses', MetaData(bind=None), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('ip', Integer(), table=, nullable=False), C olumn('slot_id', Integer(), ForeignKey('slots.id'), table=, nullable=False), схема = нет), 'connections': таблица ('connections', MetaData(bind= Нет), Столбец ('i d', Integer(), таблица =, primary_key = True, nullable = False), Столбец ('src_slot_id', Integer(), ForeignKey('slots.id'), table=), Столбец ('src_index', Inte ger(), table=), Столбец ('src_type', Enum('HDMI', 'DisplayPort', 'miniDP', 'VGA', 'DVI', 'Power', 'CAT6', 'WallNet', 'Hybrid', 'UnknownVideo'), table=), Column('dst_slot_id', Integer(), ForeignKey('slots.id'), table=), Column('dst_index', Integer(), table=), Column('dst_type', Enum('HDMI', 'Displa yPort', 'miniDP', 'VGA', 'DVI', 'Power', 'CAT6', 'WallNet', 'Hybrid', "Неизвестное Видео '), таблица =), схема = нет),' типы ': таблица (' типы ', метаданные (привязка = нет), столбец (' тип ', целое число (), таблица =, primary_key = True, nullable = False), Столбец ("имя", строка (длина =60), таблица =), схема = нет), "роли": таблица ("роли", метаданные (привязка = нет), столбец ("идентификатор", целое число (), table=, primary_key=True, nullable=False), Column('name', String(), table=, nullable=False), Column('description', String(), table=, nullable=False), Столбец ('display_driver', Boolean(), table=, nullable=False), схема =None), 'rooms': Таблица ('rooms', MetaData(bind=None), Column('id', Integer(), table=, primary_key=True, nullable=False), столбец ('location_id', Integer(), ForeignKey ('location.id'), table=, nullable=False), столбец ('parent_id', Integer(), таблица =), Столбец ('name', Строка (длина =50), таблица =), Столбец ('x_mm', Float(), table=, nullable=False), Столбец ('y_mm', Float(), table=, nullable=False), Column('z_mm', Float(), t able=, nullable=False), Column('revolution_deg', Float(), table=, nullable=False), Column('width_mm', Float(), table=, null able=False), столбец ('height_mm', Float(), table=, nullable=False), столбец (' deep_mm ', Float (), table =, nullable = False), Столбец ('has_workstations', Boolean(), ta ble=, nullable=False), схема = Нет), 'display': Таблица ('display', MetaData (bind = None), Column ('id', Integer(), таблица =, primary_key = True, nullable = False), столбец Co ("имя хоста", String (длина =100), table=), столбец ("формирование", Enum ("2x3", "1x2", " corkboard', 'desktop', 'desktop-shared'), table=, nullable=False), s chema=None), 'slots': таблица (' slots ', метаданные (bind = None), столбец (' id '), Integer(), таблица =, primary_key = True, nullable = False), столбец ('location_id', Integer(), ForeignKe y ('location.id'), table=, nullable=False), столбец ('hostname'), String(), table=), Column('item_id', Integer(), ForeignKey('items.id'), table=), Column('r ole_id', Integer(), ForeignKey('role.id')), table=), Column('parent_id', Integer(), ForeignKey('slots.id'), table=), Column('ip', Integer(), table=), столбец ('ip_ipmi', Integer(), table=), Column('ip_wlan', Integer(), table=), Column('необязательно', Boolean(), table=), Column('notes', String(), table=), Столбец ('классификация', Enum('U', 'S', 'TS'), таблица =), Column('os', String(), table=), Column('release', String(), table=), Столбец ('track', String(), t able=), Столбец ('uuid', Binary(), table=), Column('displaydata', String(), table=), схема = Нет) })

len () models.Base.metadata.tables Файл "", строка 1 len()models.Base.metadata.tables ^ SyntaxError: неверный синтаксис len(models.Base.metadata.tables) 22

Причина, по которой вам нужен объект метаданных:

  • Иметь единую единицу работы для создания и удаления связанных таблиц

  • Иметь место для сбора всех результатов операции отражения

  • Сортировать связанные таблицы на основе их зависимостей, чтобы можно было создавать ограничения внешнего ключа в правильном порядке.

Таким образом, объект метаданных содержит представление SQLAlchemy о том, как, по его мнению, может выглядеть база данных. Обычно он заполняется либо отражением, либо созданием табличных объектов (возможно, через декларативное базовое расширение).

Вы можете напрямую связать объект метаданных с реальным механизмом базы данных, установив параметр связывания в конструкторе метаданных. Альтернативно, вы можете создать ссылку, когда используете метаданные либо при создании вызовов, либо при вызовах отражения.

Другие вопросы по тегам