Hello!
I’m using many-to-many relation, and this relationship bar_list must have 
list of
instances. Some of them can be repeated (ex. [inst1, inst2, inst1]).
I attach very simplified code there (all of database interaction is hidden
under the hood, user accesses database at top level, but this example 
reflects
my problem).

foo_bar_association = Table(
    'foo_bar', Base.metadata,
    Column('foo_id', Integer, ForeignKey('foo.id')),
    Column('bar_id', Integer, ForeignKey('bar.id'))
)
class FooTable(Base):
    __tablename__ = 'foo'

    id = Column(Integer, primary_key=True)
    type = Column(String, nullable=False)

    bar_list = relationship('BarTable',
                            secondary=foo_bar_association,
                            lazy='subquery')

    def __init__(self, type_, bar_list):
        self.type = type_
        self.bar_list = bar_list
class BarTable(Base):
    __tablename__ = 'bar'

    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False)

    def __init__(self, name):
        self.name = name

When I pass two exact instances [bar_one, bar_same_one](as a relationship) 
have to be related (before session.close()) to different sessions I have 
this error:
sqlalchemy.exc.InvalidRequestError: Can't attach instance another instance 
with key is already present in this session.

with Session() as session:
    bar_one = session.query(BarTable).get(1)
with Session() as session:
    bar_same_one = session.query(BarTable).get(1)
with Session() as session:
    foo = FooTable('some_type', [bar_one, bar_same_one])
    session.add(foo)
    session.commit()

But I don’t have any error after I create instances in same session:

with Session() as session:
    bar_one = session.query(BarTable).get(1)
    bar_same_one = session.query(BarTable).get(1)
with Session() as session:
    foo = FooTable('some_type', [bar_one, bar_same_one])
    session.add(foo)
    session.commit()

And after:

with Session() as session:
    foo = FooTable('some_type', [bar_one, bar_one])
    session.add(foo)
    session.commit()

I can make a work around: 

   1. Find unique instances in bar_list and replace not unique with unique
   or 
   2. Get all bar_list ids and get all instances in same session before 
   adding
   foo instance.
   But both of them are not pure python way and seems to be complicated and 
   ugly.
   I hope there is simple alchemy solution (as adding simple attribute in 
   relationship) 

Python 3.7.10
SQLAlchemy==1.4.15

​

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/8205e75c-6d78-4123-842b-4e342ad244een%40googlegroups.com.

Reply via email to