1

Я пытаюсь использовать автоинкрементное уникальное поле ID в качестве внешнего ключа в других таблицах. Моя модель ниже:sqlalchemy значение autoincrement как внешний ключ mysql

class User(Base): 
     __tablename__ = 'Users' 

     uid = Column(INT, primary_key=True, autoincrement=True) 
     name = Column(TEXT) 
     email = Column(TEXT) 
     dateRegistered = Column(TIMESTAMP) 
     phone = Column(TEXT) 

class AddressMap(Base): 
     __tablename__ = 'AddressMaps' 

     uid = Column(INT, primary_key=True, autoincrement=True) 
     userId = Column(INT, ForeignKey('Users.uid')) 
     addressId = Column(INT, ForeignKey('Addresses.uid')) 
     dateCreated = Column(TIMESTAMP) 


     user = relationship("User", backref=backref('AddressMaps')) 
     address = relationship("Address", backref=backref('AddressMaps')) 

class Address(Base): 
     __tablename__ = 'Addresses' 

     uid = Column(INT, primary_key=True, autoincrement=True) 
     street = Column(TEXT) 
     city = Column(TEXT) 
     state = Column(TEXT) 
     postal = Column(TEXT) 
     dateRegistered = Column(TIMESTAMP) 

Моя проблема заключается в том, что при создании объекта пользователя, он не создается с UID значением. Я понимаю, это потому, что объект еще не был привязан к базе данных. Проблема в том, что, поскольку объект User имеет None как значение uid, у меня нет способа связать с ним объект AddressMap.

Что такое идиоматический способ решения этой проблемы в SQLAlchemy?

ответ

3

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

samantha = User(name='Sam', email='[email protected]', phone='555-555-5555') 

Теперь у вас есть доступ к samantha.AddressMaps коллекции (смотрите backref под user отношения в вашей AddressMap таблицы). Вы можете добавить AddressMap объекты в этой коллекции:

samantha.AddressMaps = [AddressMap(dateCreated=datetime.now()), 
         AddressMap(dateCreated=datetime.min)] 

Теперь вы можете добавить эти объекты в вашем session и commit. См. the docs для получения дополнительной информации.

Кстати, точно так же, как FYI, you don't need to include autoincrement=True на первом целочисленном столбце таблицы.