Наследование SQLAlchemy

В MySQL 5 и выше, МЕТКА ВРЕМЕНИ значения преобразовываются от зоны текущего времени до UTC для устройства хранения данных и преобразовали назад от UTC до зоны текущего времени для извлечения. (Это происходит только для Типа данных timestamp, и не для других типов, таких как ДАТА И ВРЕМЯ.)

По умолчанию, зона текущего времени для каждого соединения является временем сервера. Часовой пояс может быть установлен на основе для каждого подключения, как описано в MySQL Server Time Zone Support .

49
задан Gringo Suave 31 May 2017 в 14:00
поделиться

2 ответа

Выбор способа представления наследования в основном является проблемой проектирования базы данных. Для повышения производительности обычно лучше всего использовать наследование одной таблицы. С точки зрения правильного проектирования базы данных, наследование объединенной таблицы лучше. Наследование объединенной таблицы позволяет иметь внешние ключи для подклассов, принудительно выполняемых базой данных, гораздо проще иметь ненулевые ограничения для полей подкласса. Наследование конкретных таблиц - худшее из обоих миров.

Настройка наследования одной таблицы с декларативным способом выглядит следующим образом:

class Building(Base):
    __tablename__ = 'building'
    id = Column(Integer, primary_key=True)
    building_type = Column(String(32), nullable=False)
    x = Column(Float, nullable=False)
    y = Column(Float, nullable=False)
    __mapper_args__ = {'polymorphic_on': building_type}

class Commercial(Building):
    __mapper_args__ = {'polymorphic_identity': 'commercial'}
    business = Column(String(50))

class Residential(Building):
    __mapper_args__ = {'polymorphic_identity': 'residential'}
    num_residents = Column(Integer)

Чтобы сделать наследование объединенной таблицы, вам нужно добавить

__tablename__ = 'commercial'
id = Column(None, ForeignKey('building.id'), primary_key=True)

в подклассы.

Запросы в основном одинаковы для обоих подходов:

# buildings that are within x>5 and y>3
session.query(Building).filter((Building.x > 5) & (Building.y > 3))
# Residential buildings that have only 1 resident
session.query(Residential).filter(Residential.num_residents == 1)

] Чтобы контролировать, какие поля загружаются, вы можете использовать метод query.with_polymorphic () .

Самая важная вещь, о которой нужно подумать об использовании наследования для отображения данных, - это действительно ли вам нужно наследование или можете ли вы обойтись агрегация. Наследование будет проблемой, если вам когда-либо понадобится изменить тип здания, или ваши здания могут иметь как коммерческие, так и жилые аспекты. В таких случаях обычно лучше иметь коммерческий и жилой аспекты как связанные объекты.

Запросы в основном одинаковы для обоих подходов:

# buildings that are within x>5 and y>3
session.query(Building).filter((Building.x > 5) & (Building.y > 3))
# Residential buildings that have only 1 resident
session.query(Residential).filter(Residential.num_residents == 1)

Чтобы контролировать, какие поля загружаются, вы можете использовать метод query.with_polymorphic () .

Самая важная вещь, о которой нужно подумать об использовании наследования для отображения данных - действительно ли вам нужно наследование или можно обойтись агрегированием. Наследование будет проблемой, если вам когда-либо понадобится изменить тип здания, или ваши здания могут иметь как коммерческие, так и жилые аспекты. В таких случаях обычно лучше иметь коммерческий и жилой аспекты как связанные объекты.

Запросы в основном одинаковы для обоих подходов:

# buildings that are within x>5 and y>3
session.query(Building).filter((Building.x > 5) & (Building.y > 3))
# Residential buildings that have only 1 resident
session.query(Residential).filter(Residential.num_residents == 1)

Чтобы контролировать, какие поля загружаются, вы можете использовать метод query.with_polymorphic () .

Самая важная вещь, о которой нужно подумать об использовании наследования для отображения данных - действительно ли вам нужно наследование или можно обойтись агрегированием. Наследование будет проблемой, если вам когда-либо понадобится изменить тип здания, или ваши здания могут иметь как коммерческие, так и жилые аспекты. В таких случаях обычно лучше иметь коммерческий и жилой аспекты как связанные объекты.

действительно ли вам нужно наследование или можно обойтись агрегированием. Наследование будет проблемой, если вам когда-либо понадобится изменить тип здания, или ваши здания могут иметь как коммерческие, так и жилые аспекты. В таких случаях обычно лучше иметь коммерческий и жилой аспекты как связанные объекты.

действительно ли вам нужно наследование или можно обойтись агрегированием. Наследование будет проблемой, если вам когда-либо понадобится изменить тип здания, или ваши здания могут иметь как коммерческие, так и жилые аспекты. В таких случаях обычно лучше иметь коммерческий и жилой аспекты как связанные объекты.

81
ответ дан 7 November 2019 в 11:41
поделиться

Решение Ants Aasma намного элегантнее, но если вы намеренно сохраняете определения классов отдельно от определений таблиц, вам необходимо сопоставить классы с таблицами с помощью функции сопоставления. После того, как вы определили свои классы, вам нужно определить свои таблицы:

building = Table('building', metadata,
    Column('id', Integer, primary_key=True),
    Column('x', Integer),
    Column('y', Integer),
)
commercial = Table('commercial', metadata,
    Column('building_id', Integer, ForeignKey('building.id'), primary_key=True),
    Column('business', String(50)),
)
residential = Table('residential', metadata,
    Column('building_id', Integer, ForeignKey('building.id'), primary_key=True),
    Column('numResidents', Integer),
)

Затем вы можете сопоставить таблицы с классами:

mapper(Building, building)
mapper(Commercial, commercial, inherits=Building, polymorphic_identity='commercial')
mapper(Residential, residential, inherits=Building, polymorphic_identity='residential')

Затем взаимодействовать с классами точно так же, как описал Антс Аасма.

12
ответ дан 7 November 2019 в 11:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: