On Fri, Jul 21, 2017 at 7:57 AM, Mauro Caceres <mcace...@onapsis.com> wrote:
> Hi Guys,
>
> Im using sqlachemy SQLAlchemy==1.0.14 on PostgresDB.
>
> Im trying to understand if it is possible to delete all childs in a one to
> many relation but with the distinction that there would be orphans in the
> table, that is childs with the foreign key in NULL.
>
> This is what I have....
>
> Class Parent(Base):
>     __tablename__ = 'parent_table'
>     id = Column(Integer, primary_key=True)
>
>
> Class Child(Base):
>     __tablename__ = 'parent_table'
>     id = Column(Integer, primary_key=True)
>     parent_id = Column(Integer, ForeignKey('parent_table.id',
> ondelete='CASCADE'), index=True, nulleable=True)
>     parent = relationship("Parent", backref=backref("childs",
>                                                  passive_deletes=True,
>                                                  cascade="all, delete"))
>
>
> With the above definition when I do:
>
> parent = s.query(Parent).first()
> s.delete(parent)
>
> The parent row is deleted, but the related childs are not, the cascade
> relation does not work.
>
> If I remove the nulleable=True from the foreingkey definition then the
> cascade works as expected.... Is any configuration that I may be missing to
> make it work with the nulleable=True...

Hi there -

let's work with a complete test:

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class Parent(Base):
    __tablename__ = 'parent_table'
    id = Column(Integer, primary_key=True)


class Child(Base):
    __tablename__ = 'child_table'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent_table.id',
                       ondelete='CASCADE'),
                       index=True, nullable=True)
    parent = relationship("Parent", backref=backref("childs",
                          passive_deletes=True,
                          cascade="all, delete"))


e = create_engine("postgresql://scott:tiger@localhost/test", echo=True)
Base.metadata.drop_all(e)
Base.metadata.create_all(e)

s = Session(e)

s.add(Parent(childs=[Child(), Child()]))
s.commit()

parent = s.query(Parent).first()
s.delete(parent)
s.commit()

# child objects were deleletd
assert s.query(Child).count() == 0


the above test succeeds for me.    Does it work for you?




>
> Thanks a lot.
>
>
> This email and any files transmitted with it are confidential and intended
> solely for the use of the individual or entity to whom they are addressed.
> If you have received this email in error please notify the system manager.
> This message contains confidential information and is intended only for the
> individual named. If you are not the named addressee you should not
> disseminate, distribute or copy this e-mail.
> Please notify the sender immediately by e-mail if you have received this
> e-mail by mistake and delete this e-mail from your system. If you are not
> the intended recipient you are notified that disclosing, copying,
> distributing or taking any action in reliance on the contents of this
> information is strictly prohibited.
>
> --
> 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.

-- 
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