sqlalchemy / настройка таблицы - PullRequest
0 голосов
/ 13 января 2012

У меня есть предметы, склады, и предметы находятся на складах.

Итак, у меня есть таблица с информацией об элементах (номер, описание, стоимость ...) и таблица, описывающая склады (местоположение, код, название, ...).Теперь мне нужен способ хранения инвентаря, чтобы я знал, что у меня есть Х предметов на складе Y. Предмет может быть на любом складе.

Как бы я мог установить отношения между ними и хранить кол-во?

class Item(DeclarativeBase):
    __tablename__ = 'items'
    item_id = Column(Integer, primary_key=True,autoincrement=True)
    item_code = Column(Unicode(35),unique=True)
    item_description = Column(Unicode(100))
    item_long_description = Column(Unicode())
    item_cost = Column(Numeric(precision=13,scale=4))
    item_list = Column(Numeric(precision=13,scale=2))
    def __init__(self,code,description,cost,list):
        self.item_code = code
        self.item_description = description
        self.item_cost = cost
        self.item_list = list

class Warehouse(DeclarativeBase):
    __tablename__ = 'warehouses'
    warehouse_id = Column(Integer, primary_key=True, autoincrement=True)
    warehouse_code = Column(Unicode(15),unique=True)
    warehouse_description = Column(Unicode(55))

Если я прав, я бы настроил многие ко многим, используя промежуточную таблицу, что-то вроде ...

item_warehouse = Table(
    'item_warehouse', Base.metadata,
    Column('item_id', Integer, ForeignKey('items.item_id')),
    Column('warehouse_id', Integar, ForeignKey('warehouses.warehouse_id'))
)

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

Какова будет "лучшая" практика для моделирования этого и использования его в моем приложении?

Ответы [ 2 ]

2 голосов
/ 13 января 2012

Модель:

Как уже упоминалось @Lafada, вам нужен объект ассоциации.Таким образом, я бы создал постоянный объект SA, а не только таблицу:

class ItemWarehouse(Base):
    # version-1:
    __tablename__ = 'item_warehouse'
    __table_args__ = (PrimaryKeyConstraint('item_id', 'warehouse_id', name='ItemWarehouse_PK'),)
    # version-2:
    #__table_args__ = (UniqueConstraint('item_id', 'warehouse_id', name='ItemWarehouse_PK'),)
    #id = Column(Integer, primary_key=True, autoincrement=True)

    # other columns
    item_id = Column(Integer, ForeignKey('items.id'), nullable=False)
    warehouse_id = Column(Integer, ForeignKey('warehouses.id'), nullable=False)
    quantity = Column(Integer, default=0)

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

  • добавлен PrimaryKey
  • добавил UniqueConstraint, охватывающий пары (item_id, warehouse_id).

В приведенном выше коде это решается двумя способами:

  • version-1: используется составной первичный ключ (который должен быть уникальным)
  • version-2: использует простой первичный ключ, но также добавляет явное уникальное ограничение [Мне лично нравится этот параметр]

Отношение: объект ассоциации

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

w = Warehouse(...)
i = Item(name="kindle", price=...)
iw = ItemWarehouse(quantity=50)
iw.item = i
w.items.append(i)

Отношение: прокси-сервер ассоциации расширение

или вы можете пойти еще дальшеи используйте пример Composite Association Proxies , и вы можете настроить словарный доступ к объекту ассоциации следующим образом:

w = Warehouse(...)
i = Item(name="kindle", price=...)
w[i] = 50 # sets the quantity to 50 of item _i_ in warehouse _w_
i[w] = 50 # same as above, if you configure it symmetrically

Осторожно: код дляопределение отношений может выглядеть действительно не легко читаемым , но шаблон использования действительно хорош.Поэтому, если этот параметр слишком сложен, я бы начал с объекта «Объект», возможно, с некоторыми вспомогательными функциями для добавления / получения / обновления запасов элементов, и в конечном итоге перешел бы к расширению «Прокси-сервер ассоциации».

2 голосов
/ 13 января 2012

Вы должны использовать «Объект ассоциации» .

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

item_warehouse = Table( 'item_warehouse', 
                        Base.metadata, 
                        Column('item_id', 
                               Integer, 
                               ForeignKey('items.item_id')
                        ), 
                        Column('warehouse_id', 
                               Integar, 
                               ForeignKey('warehouses.warehouse_id')
                        ), 
                        Column('qty',
                               Integer,
                               default=0,
                        ),
                      )

Теперь вы можете добавить warehouse, item и qty в один объект, и вам нужно написать метод, который будет принимать warehouse_id и item_id и получать sum из qty для этих элементов.

Надеюсь, это поможет вам решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...