Skip to content

Instantly share code, notes, and snippets.

@remimarenco
Created January 9, 2017 22:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save remimarenco/3a9919d58a1b5987cdced1fff62cc606 to your computer and use it in GitHub Desktop.
Save remimarenco/3a9919d58a1b5987cdced1fff62cc606 to your computer and use it in GitHub Desktop.
No user.home_folder or user.trash_folder
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(80), unique=True)
home_folder_id = Column(Integer, ForeignKey("folders.id"))
home_folder = relationship("Folder",
foreign_keys="User.home_folder_id",
backref="home_user")
trash_folder_id = Column(Integer, ForeignKey("folders.id"))
trash_folder = relationship("Folder",
foreign_keys="User.trash_folder_id",
backref="trash_user")
class Entry(Base):
__tablename__ = 'entries'
id = Column(Integer, primary_key=True)
name = Column(String(80), unique=True)
type = Column(String(50))
__mapper_args__ = {
'polymorphic_identity': classmethod.__class__.__name__,
'polymorphic_on': type,
'with_polymorphic': '*'
}
class Folder(Entry):
# Enum Folder types
# TODO: Could be a good idea to transform these enums into Classes. So they can have different behaviors if needed
class FolderType(enum.Enum):
home = 'home'
trash = 'trash'
folder = 'folder'
__tablename__ = 'folders'
# TODO: Instead of using a string 'entry.id', can we use Entry.id?
id = Column(Integer, ForeignKey('entries.id'), primary_key=True)
folder_type = Column(Enum(FolderType))
description = Column(Text)
entries = relationship("Entry",
secondary=folder_entry_association_table,
backref=__tablename__)
creator_id = Column(Integer, ForeignKey("users.id"))
creator = relationship("User",
foreign_keys="Folder.creator_id",
backref=__tablename__)
__mapper_args__ = {
'polymorphic_identity': "Folder"
}
new_user = User(name=name)
home_folder = Folder(name="Home",
folder_type=Folder.FolderType.home,
creator=new_user)
trash_folder = Folder(name="Trash",
folder_type=Folder.FolderType.trash,
creator=new_user)
session.add(home_folder)
session.add(trash_folder)
session.add(new_user)
session.commit()
## home_folder and trash_folder are ok.
## new_user.home_folder => Nothing, new_user.trash_folder => Nothing
@inklesspen
Copy link

The problem is you have two different foreign keys. You're setting the creator relationship, which sets the creator_id foreign key. But sqlalchemy has no idea this is supposed to also set new_user.home_folder or new_user.trash_folder, because those use different foreign keys.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment