Найти - Пользователи
Полная версия: Помогите разобраться. Sqlalchemy. создание моделей.
Начало » Базы данных » Помогите разобраться. Sqlalchemy. создание моделей.
1
Astronaut
Доброго времени суток, господа.
Я новичек в программировании, и для освоения python, решил сделать приложение для управления БД.
После чтения разных примеров из разных источников, у меня возник вопрос праивльный ли я выбрал подход к структуре и модели БД.
Суть такова: в БД будут хранится данные о предприятиях и их подчиненных. Вот картинка как выглядит структура:

Добавлю пояснения словами. Есть Компания, которая имеет несколько направлений занятости (one-to-many), множество сотрудников (которые могут работать в разных компаниях, поэтому я выбрал many-to-many). Сотрудники занимаются определенную (-ые) должности ( поэтому я выбрал one-to-many). Хотя у должностей, естественно может быть множество сотрудников, но я думаю many-to-many здесь ни к чему.

Соответсвенно вышеизложенной схеме получается следующий код:
comp_empl_link = Table('comp_empl_link', Base.metadata,
                       Column('company_id', Integer, ForeignKey('company.id')),
                       Column('employee_id', Integer, ForeignKey('employee.id')))
class Company(Base):
    __tablename__ = 'company'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    address = Column(String)
    employee = relationship('Employee', secondary=comp_empl_link)
    occupation = relationship('Occupation')
    def __init__(self, name, address):
        self.name = name
        self.address = address
    def __repr__(self):
        return "<Company name: %s; Address: %s>" % (self.name, self.address)
class Employee(Base):
    __tablename__ = 'employee'
    id = Column(Integer, primary_key=True)
    first_name = Column(String)
    last_name = Column(String)
    patronymic = Column(String)
    birthday = Column(Date)
    company = Column(Integer, ForeignKey('company.id'))
    position = relationship('Position')
    def __init__(self, first_name, last_name, patronymic, birthday):
        self.first_name = first_name
        self.last_name = last_name
        self.patronymic = patronymic
        self.birthday = birthday
    def __repr__(self):
        return "<Employee: %s %s %s; birth - %s" % (self.first_name, self.last_name, self.patronymic, self.birthday)
class Occupation(Base):
    __tablename__ = 'occupation'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    desc = Column(String)
    company_id = Column(Integer, ForeignKey('company.id'))
class Position(Base):
    __tablename__ = 'position'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    desc = Column(String)
    employee_id = Column(Integer, ForeignKey('employee.id'))

Прошу прокомментировать мой подход, правильно ли я все понял и сделал ? Правильно ли созданы конструкторы, и нужно ли их вообще указывать ?
Как реализовать, например такое: имеется определенный список должностей, уже занесенный в таблицу, и при внесении нового сотрудника выбрать его должность из имеющихся записей, а не создавать новую?

Очень жду ваших комментариев.

ps: в коде, почему-то, не отображаются абзацы.
4kpt_III
Напишите на почту свой скайп. Покажу как вообще алхимией пользоваться. Очень и очень няшная вещь. Необходимо просто понять, как в БД создаются FK, в чем разница между MTO, OTM и OTO на уровне таблиц БД и на уровне моделей.
Astronaut
4kpt_III
Напишите на почту свой скайп. Покажу как вообще алхимией пользоваться. Очень и очень няшная вещь. Необходимо просто понять, как в БД создаются FK, в чем разница между MTO, OTM и OTO на уровне таблиц БД и на уровне моделей.
Я Вам отправил e-mail
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB