On Wed, Jun 12, 2019, at 10:10 AM, Javier Martínez wrote: > Hi everyone, > I am searching but I find no solution for my issue that is why I decided to > ask here. Thanks in advance for your attention. > > The issue is related to the update of a second level hierarchy object Id. I > am creating a hierarchy, following the recommendations in the tutorials but I > find that when I want to update the id, which is the link between all the > entities through the foreign key, only the first and the third level (last > level) of the hierarchy update the id value. I think this could be an issue > because the id is what will link the tables for further queries. I attach an > example of the code:
thanks for the excellent test case. There is a bug here which I have set up in https://github.com/sqlalchemy/sqlalchemy/issues/4723. however, for SQLite without PRAGMA FOREIGN KEYS as well as MySQL ISAM, your program will work as expected by adding passive_updates=False, which is needed for your test to run correctly in any case: class Employee(Base): __tablename__ = 'employees' employee_id = Column(Integer, primary_key=True) name = Column(String(50)) type = Column(String(30), nullable=False) __mapper_args__ = { 'polymorphic_identity': 'employee', 'polymorphic_on': type, 'with_polymorphic': '*', 'passive_updates': False } if you want your program to work on a database that enforces foreign keys you need to add onupdate="cascade" to your ForeignKey definitions, and additionally you need the fix for the above #4723 for it to work in all cases, although if you do explicitly update other non-primary key columns on manager, that will work around #4723 for now. > > from sqlalchemy import ( > Column, Integer, String, create_engine, > ForeignKey) > from sqlalchemy.orm import create_session > from sqlalchemy.ext.declarative import declarative_base > > e = create_engine("sqlite:///test.db", echo=True) > Base = declarative_base(bind=e) > > > *class* Employee(Base): > __tablename__ = 'employees' > > employee_id = Column(Integer, primary_key=True) > name = Column(String(50)) > type = Column(String(30), nullable=False) > > __mapper_args__ = { > 'polymorphic_identity': 'employee', > 'polymorphic_on': type, > 'with_polymorphic': '*' > } > > *def* __init__(self, name): > self.name = name > > > *class* Manager(Employee): > __tablename__ = 'managers' > __mapper_args__ = {'polymorphic_identity': 'manager'} > > employee_id = Column( > Integer, > ForeignKey('employees.employee_id'), > primary_key=True > ) > manager_data = Column(String(50)) > > *def* __init__(self, name, manager_data): > super(Manager, self).__init__(name) > self.manager_data = manager_data > > > *class* Owner(Manager): > __tablename__ = 'owners' > __mapper_args__ = {'polymorphic_identity': 'owner'} > > employee_id = Column( > Integer, > ForeignKey('employees.employee_id'), > ForeignKey('managers.employee_id'), > primary_key=True > ) > owner_secret = Column(String(50)) > > *def* __init__(self, name, manager_data, owner_secret): > super(Owner, self).__init__(name, manager_data) > self.owner_secret = owner_secret > > > Base.metadata.drop_all() > Base.metadata.create_all() > > s = create_session(bind=e, autoflush=True, autocommit=False) > o = Owner('nosklo', 'mgr001', 'ownerpwd') > s.add(o) > s.commit() > > el = s.query(Owner).one() > *# for el in session.query(Product, Event,Travel).all():* > print(el) > el.employee_id = 33 > *# el.manager_data='hello'* > s.commit() > > > The response when running this is : > 2019-06-12 16:07:36,232 INFO sqlalchemy.engine.base.Engine UPDATE employees > SET employee_id=? WHERE employees.employee_id = ? > 2019-06-12 16:07:36,233 INFO sqlalchemy.engine.base.Engine (33, 1) > 2019-06-12 16:07:36,233 INFO sqlalchemy.engine.base.Engine UPDATE owners SET > employee_id=? WHERE owners.employee_id = ? > 2019-06-12 16:07:36,233 INFO sqlalchemy.engine.base.Engine (33, 1) > 2019-06-12 16:07:36,234 INFO sqlalchemy.engine.base.Engine COMMIT > > So it is not updating my Manager table....and that is a big issue.... > Any idea about it? > > Thanks > > > -- > SQLAlchemy - > The Python SQL Toolkit and Object Relational Mapper > > http://www.sqlalchemy.org/ > > To post example code, please provide an MCVE: Minimal, Complete, and > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > description. > --- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sqlalchemy+unsubscr...@googlegroups.com. > To post to this group, send email to sqlalchemy@googlegroups.com. > Visit this group at https://groups.google.com/group/sqlalchemy. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sqlalchemy/c204902f-bab1-4b01-8937-0c2746758ca1%40googlegroups.com > > <https://groups.google.com/d/msgid/sqlalchemy/c204902f-bab1-4b01-8937-0c2746758ca1%40googlegroups.com?utm_medium=email&utm_source=footer>. > For more options, visit https://groups.google.com/d/optout. -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. To view this discussion on the web visit https://groups.google.com/d/msgid/sqlalchemy/aa783d0b-c63c-4897-9ee8-248ca3ff27ef%40www.fastmail.com. For more options, visit https://groups.google.com/d/optout.