Sorry if you receive this twice, I am not sure if it had been
correctly posted.
On 26 août, 14:49, Martin-Leon Francois
wrote:
> hi,
>
> The problem seems to be a little bit more general, I have a unique class
> (doing nothing) mapped to a unique table.
> After opening a session, I create an instance, add it to the session, flush,
> commit.
> Everything is ok. --> a row in the table, instance in the identity_map of the
> session
>
> Always in the same session, I delete the instance from the session., flush,
> commit.
> Everything is ok. --> no row in the table, no instance in the identity_map
> of the session
>
> Always the same session, I add again the python instance to the session,
> flush, commit.
> ??? --> no row in the table, instance in the identity_map of the session
>
> Could you have a look to the code below and help me figure out what I doing
> wrong?
> fma
>
> from sqlalchemy import __version__, MetaData, Table, Column, Integer, String,
> create_engine, orm #...@unresolvedimport
> from sqlalchemy.orm import mapper #...@unresolvedimport
> from sqlalchemy.orm import backref #...@unresolvedimport @UnusedImport
>
> print __version__
>
> meta = MetaData()
> tb_one = Table("one", meta,
> Column('name',String(50)),
> Column('id',Integer, primary_key=True))
>
> class One(object):
> def __init__(self, name):
> self.name = name
>
> def __repr__(self):
> return self.name
>
> mapper_one = mapper(One,tb_one)
> engine = create_engine('postgres://fma:fma6...@localhost:5432/postgres',
> convert_unicode=True)
> Session = orm.sessionmaker(autoflush=True, autocommit=False, bind=engine)
> meta.bind = engine
> meta.drop_all(checkfirst=True)
> meta.create_all(checkfirst=True)
>
> s = Session()
>
> o1 = One("One")
> s.add(o1)
> s.add_all([o1])
> s.flush()
> s.commit()
>
> print list(s.query(One)), s.identity_map
> s.delete(o1)
> s.flush()
> s.commit()
> print list(s.query(One)), s.identity_map
>
> #If I uncomment the following line (workaround) instance is written down to
> #the database as I would expect
> #o1._sa_instance_state = o1._sa_class_manager._create_instance_state(o1)
>
> s.add(o1)
> s.add_all([o1])
> s.flush()
> s.commit()
> print list(s.query(One)), s.identity_map
> s.close()
>
> Le 26 août 2010 à 08:42, fma a écrit :
>
>
>
> > Any suggestion helping solving this?
>
> > On 25 août, 13:02, Martin-Leon Francois
> > wrote:
> >> Hi,
>
> >> I am trying in the same session to detach an instance from a collection (
> >> one to many)
> >> flush and commit everything (all is ok) and then attach the removed
> >> instance again. unsuccessfully.
>
> >> in below code, last "assert" fails.
> >> I don't understand why I am not able to append m2 to o1.to_many collection
> >> once removed.
>
> >> Any idea? ( I use sa 0.5.6)
>
> >> thanx, Francois
>
> >> meta = MetaData()
> >> tb_one = Table("one", meta,
> >> Column('name',String(50)),
> >> Column('id',Integer, primary_key=True))
>
> >> tb_many = Table("many", meta,
> >> Column('name',String(50)),
> >> Column('id',Integer, primary_key=True),
> >> Column('one_id', Integer,
> >> ForeignKey(tb_one.c.id,ondelete='CASCADE'), nullable=False),)
>
> >> class One(object):
> >> def __init__(self, name):
> >> self.name = name
>
> >> class Many(object):
> >> def __init__(self, name):
> >> self.name = name
>
> >> mapper_one = mapper(One,tb_one)
> >> mapper_many = mapper(Many, tb_many,
> >> properties = dict(
> >> to_one = relation(One,uselist=False,
> >> backref=backref('to_many', cascade="save-update, merge, delete,
> >> delete-orphan"),)))
>
> >> engine = create_engine()
> >> Session = orm.sessionmaker(autoflush=True, autocommit=False, bind=engine)
>
> >> meta.bind = engine
> >> meta.drop_all(checkfirst=True)
> >> meta.create_all(checkfirst=True)
>
> >> s = Session()
> >> m1 = Many("M1")
> >> m2 = Many("M2")
> >> o1 = One("One")
> >> o1.to_many.append(m1)
> >> o1.to_many.append(m2)
&