hey dale -

ive created a test suite for this in test/objectstore.py PrivateAttrTest,
along with a test for another behavior of private attributes that
interacts with this one intimately.  I took off the assertion that was
stopping you and made some other adjustments to support the operation and
the commit goes through now, if you catch up to SVN 1234.

- mike



Dale Sedivec wrote:
>       [Sorry if this makes it onto the list twice.  I posted through
> Gmane NNTP and was told the message was sent to moderation.  I haven't
> seen it appear on the list yet.]
>
>       Greetings.  I've got a database with a parent/children
> relationship (one-to-many, to clarify).  When a parent is deleted, all
> children should be deleted; this is reflected in the schema (ON DELETE
> CASCADE) as well as in the SA relationship (private=True).
>
>        However, I'm running into problems in the case where a
> child's parent needs to be changed.  I've demonstrated this in the
> test script included below.  As near as I can tell the reassignment
> works like:
>
> (1) Delete child from old parent.
>         (a) Parent says "my children are private, so delete the
>             child."
> (2) Add child to new parent, resulting in an exception because the
>     child has been deleted.
>
> It looks to me like this trouble may originate around
> GenericBackrefExtension.set(), where it does a "remove" followed by an
> "append."  I tried to step through this code but I wasn't able to
> follow it.
>
>        Would it be possible to modify this code (or modify elsewhere)
> so that the calls to remove the object from the parent know that the
> child is not being removed, but reassigned to a different parent?
> I.e., ignore the private=True for cases of reassigning a parent?
>
>       Or, alternatively, will anyone kindly suggest a recipe for
> getting around this problem?  The only way I've found is something
> roughly like (using variables from below test):
>
> child.foo_id = new_parent.id
> child.commit()             # Actually issues SQL UPDATE statement
> objectstore.refresh(child) # If you don't refresh, child.foo is None
> assert child.new is new_parent
>
>        Thanks for any assistance, and thanks for SA.
>
> Dale
>
> ----
>
> from sqlalchemy import *
>
> # -- PostgreSQL 8.1.3, using the following schema:
> #
> # CREATE TABLE foo (id INTEGER PRIMARY KEY);
> # CREATE TABLE bar (id INTEGER PRIMARY KEY,
> #                   foo_id INTEGER REFERENCES foo (id) NOT NULL
> #                                  ON DELETE CASCADE);
> # INSERT INTO foo VALUES (1);
> # INSERT INTO foo VALUES (2);
> # INSERT INTO bar VALUES (3, 1);
>
> db_uri = "postgres://database=oit_pwdb&user=oit_pwdb&password=qipiY24P"
> engine = create_engine(db_uri, echo=True)
>
> foos = Table("foo", engine, autoload=True)
> bars = Table("bar", engine, autoload=True)
>
> class Foo (object): pass
> assign_mapper(Foo, foos)
> class Bar (object): pass
> assign_mapper(Bar, bars)
>
> cascade_mappers(Foo, Bar)
> Foo.mapper.add_property("bars", relation(Bar, backref="foo",
> private=True))
>
> # Actual problem section is here.
> child = Bar.get(3)
> old_parent = Foo.get(1)
> assert child.foo is old_parent, "test setup failed"
> new_parent = Foo.get(2)
> child.foo = new_parent
> # The above statement raises the following exception:
> #
> #   File
> #
> ".../python2.4/site-packages/SQLAlchemy-0.1.5-py2.4.egg/sqlalchemy/mapping/unitofwork.py",
> #   line 47, in list_value_changed
> #     raise InvalidRequestError("re-inserting a deleted value into a
> list")
>
> # Never get here.
> child.commit()
> assert child.foo_id == new_parent.id, "parent change failed"
>
>
> -------------------------------------------------------
> This SF.Net email is sponsored by xPML, a groundbreaking scripting
> language
> that extends applications into web and mobile media. Attend the live
> webcast
> and join the prime developer group breaking into this new coding
> territory!
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
> _______________________________________________
> Sqlalchemy-users mailing list
> Sqlalchemy-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users
>



-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to