Я хотел бы представить тип данных как отдельный столбец в моей модели, но действительно данные будут храниться в нескольких столбцах в базе данных. Я не могу найти хорошие ресурсы о том, как сделать это в SQLAlchemy.
Я хотел бы, чтобы моя модель была похожа на это (это - упрощенный пример с помощью геометрии вместо моей настоящей проблемы, которую более трудно объяснить):
class 3DLine(DeclarativeBase):
start_point = Column(my.custom.3DPoint)
end_point = Column(my.custom.3DPoint)
Таким образом, я мог присвоить объект с (x, y, z) компоненты точки сразу, не устанавливая их индивидуально. Если бы я должен был разделить каждый компонент, то это могло бы стать ужасным, особенно если каждый класс имеет несколько из этих составных объектов. Я объединил бы значения в одно закодированное поле за исключением того, что я должен запрашивать каждое значение отдельно время от времени.
Я смог узнать, как сделать пользовательские типы с помощью отдельного столбца в документации. Но нет никакого признака, что я могу отобразить единственный тип на несколько столбцов.
Я предполагаю, что мог выполнить это при помощи отдельной таблицы, и каждый столбец будет внешним ключом, но в моем случае я не думаю, что имеет смысл иметь одно к одному отображению для каждой точки к отдельной таблице, и это все еще не дает способность установить связанные значения внезапно.
Вот минимальный пример, основанный на документации :
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),
)