Hello,

For 1-to-1 model relationships, when relationship value is updated,  the 
default SQLAlchemy behavior is to set the foreign key column of previous 
relationship value to NULL.
I would like to configure SQLAlchemy to not set the foreign key column to 
NULL, but instead to set a `deleted` flag to true. This will allow me to 
have historical data.
Having read docs on cascade, I have not found an option that can configure 
this. Is this doable?

Here is a test I want passing

from sqlalchemy import Column, Integer, String, ForeignKey, Boolean
from sqlalchemy import create_engine, and_
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy.orm import sessionmaker

Base = declarative_base()
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)


class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    _address = relationship("Address",
                            primaryjoin=lambda: and_(Address.user_id == 
User.id,
                                                     ~Address.deleted),
                            uselist=False,
                            back_populates="user")

    @property
    def address(self):
        return self._address

    @address.setter
    def address(self, new_address):
        if self._address:
            self._address.deleted = True
        self._address = new_address


class Address(Base):
    __tablename__ = 'addresses'
    id = Column(Integer, primary_key=True)
    email = Column(String, nullable=False)
    deleted = Column(Boolean, nullable=False, default=False)

    user_id = Column(Integer, ForeignKey('users.id'))
    user = relationship("User")


def test():
    Base.metadata.create_all(engine)
    sess = Session()

    a1 = Address(email='foo')
    u = User(id=1, address=a1)
    sess.add_all([u, a1])
    sess.commit()

    u.address = Address(email='bar')
    sess.commit()

    assert a1.user_id == 1, a1.user_id


test()


Thanks in advance

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to