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