Отношение один к одному Flask-SQLalchemy: связать ребенка с уже существующим родителем? - PullRequest
0 голосов
/ 07 декабря 2018

при первом использовании sqlalchemy и flask я что-то пропускаю

Я пытаюсь установить взаимно-однозначное соотношение между двумя таблицами с помощью Flask-SQLalchemy.

Это мойпервая таблица (родитель)

class User(db.Model):
__tablename__ = 'users'

user_id = Column(Integer, primary_key=True, autoincrement=True)
user_email = Column(String(150), nullable=False)
user_password = Column(String(60), nullable=False)
child_employee = relationship('Employee', uselist=False, backref='users')

def __init__(self, user_email, user_password):
    self.user_email = user_email
    self.user_password = user_password

и дочерний элемент

class Employee(User):
__tablename__ = 'employees'

employee_id = Column(Integer, primary_key=True, autoincrement=True)
user_id = Column(Integer, ForeignKey('users.user_id'), nullable=False)
employee_lastname = Column(String(30), nullable=False)
employee_firstname = Column(String(30), nullable=False)
employee_comment = Column(String)

def __init__(self, user_email, user_password, employee_lastname, employee_firstname, employee_comment=None):
    super().__init__(user_email, user_password)
    self.employee_lastname = employee_lastname
    self.employee_firstname = employee_firstname
    self.employee_comment = employee_comment

Знайте, когда я создаю пользователя, в моей таблице есть пользователь «пользователи» и ничего в моей таблице »сотрудники ": это имеет смысл, идеально

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

Теперь вопрос: Я создал пользователя, поэтому ни один сотрудник не связан с ним.Теперь я хочу создать сотрудника и связать его с уже существующим пользователем, как я могу это сделать?

Я пытался

# creation of the new employee
  new_employee = Employee(exisiting_user.user_email, 
    exisiting_user.user_password, "email", "lastname", "firstname")
  #trying to associate the new employee to the already existing user
  exisiting_user.child_employee = new_employee
  # save the employee to the database
  db.session.add(new_employee)
  db.session.commit()

, но я получаю эту ошибку

sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) duplicate key value violates unique constraint "users_pkey"
DETAIL:  Key (user_id)=(2) already exists.

 [SQL: 'INSERT INTO users (user_id, user_email, user_password) VALUES (%(user_id)s, %(user_email)s, %(user_password)s)'] [parameters: {'user_id': 2, 'user_email': 'email', 'user_password': 'password'}] 

Спасибо ---------------- Сначала попробуйте решить его ------------------------- Как будто я правильно понимаю, когда я создаю экземпляр «Сотрудник», у меня также есть экземпляр суперкласса «Пользователь».Затем, когда я db.session.add (new_employee), SQLalchemy создает INSERT для сотрудника, а затем для пользователя, но пользователь уже существует, поэтому у меня есть ошибка.

Я изменяю свою таблицу Employee:

class Employee(User):
__tablename__ = 'employees'

employee_id = Column(Integer, ForeignKey(User.user_id), primary_key=True)
employee_lastname = Column(String(30), nullable=False)
employee_firstname = Column(String(30), nullable=False)
employee_comment = Column(String)
parent = relationship("User", back_populates="child_employee")

def __init__(self, employee_id, employee_lastname, employee_firstname, employee_comment=None):
    self.employee_id = employee_id
    self.employee_lastname = employee_lastname
    self.employee_firstname = employee_firstname
    self.employee_comment = employee_comment

и для добавления только сотрудника я делаю

emp = Employee(1, "lastname", "firstname", "comment")
db.session.execute("INSERT INTO employees VALUES("emp.employee_id",'"emp.employee_lastname+"', '"+emp.employee_firstname+"', '"+emp.employee_comment+"')")

Из-за идентификатора, который также является внешним ключом, сотрудник и пользователь автоматически связываются

Это работает, но я бы предпочел использовать что-то более простое, например db.session.add (emp), я все еще что-то упускаю

...