2009-12-31 2 views
6

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

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

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

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

Я смог узнать, как создавать пользовательские типы, используя один столбец in the documentation. Но нет никаких признаков того, что я могу сопоставить один тип с несколькими столбцами.

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

ответ

7

Вот минимальный пример, основанный на documentation:

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), 
    ) 
+0

Это отлично подходит для одноразового использования, однако такой подход не позволяет учитывать его как отдельный вид, в тех случаях, как и выше, когда представляют собой два составных поля одного типа (start_point и end_point) - будет дублирование имен столбцов. Можно ли использовать автоматический вывод имен столбцов, который работает для полей с одним столбцом, и просто добавлять «_x», «_y» и «_z» к нему? (Мета: должен ли я задать отдельный вопрос об этом?) – Veky

Смежные вопросы