Пользовательский тип SQLAlchemy, который содержит несколько столбцов

Я хотел бы представить тип данных как отдельный столбец в моей модели, но действительно данные будут храниться в нескольких столбцах в базе данных. Я не могу найти хорошие ресурсы о том, как сделать это в SQLAlchemy.

Я хотел бы, чтобы моя модель была похожа на это (это - упрощенный пример с помощью геометрии вместо моей настоящей проблемы, которую более трудно объяснить):

class 3DLine(DeclarativeBase):
    start_point = Column(my.custom.3DPoint)
    end_point = Column(my.custom.3DPoint)

Таким образом, я мог присвоить объект с (x, y, z) компоненты точки сразу, не устанавливая их индивидуально. Если бы я должен был разделить каждый компонент, то это могло бы стать ужасным, особенно если каждый класс имеет несколько из этих составных объектов. Я объединил бы значения в одно закодированное поле за исключением того, что я должен запрашивать каждое значение отдельно время от времени.

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

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

6
задан Kekoa 31 December 2009 в 20:03
поделиться

1 ответ

Вот минимальный пример, основанный на документации :

class 3DPoint(object):
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

     def __composite_values__(self):
        return (self.x, self.y, self.z)

class 3DLine(DeclarativeBase):
    start_point = sqlalchemy.orm.composite(
        3DPoint,
        Column('start_point_x', Integer, nullable=False),
        Column('start_point_y', Integer, nullable=False),
        Column('start_point_z', Integer, nullable=False),
    )
:

class 3DPoint(object):
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

     def __composite_values__(self):
        return (self.x, self.y, self.z)

class 3DLine(DeclarativeBase):
    start_point = sqlalchemy.orm.composite(
        3DPoint,
        Column('start_point_x', Integer, nullable=False),
        Column('start_point_y', Integer, nullable=False),
        Column('start_point_z', Integer, nullable=False),
    )
7
ответ дан 17 December 2019 в 00:10
поделиться
Другие вопросы по тегам:

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