Юрий Пайков
2015-04-14 07:55:21 UTC
My question is when I have in a session a newly created object(doesn't have
primary key yet, but will obtain it upon flush) and I merge to that session
another object referring to the first one by relationship (*b* in the
example) SQLAlchemy doesn't populate latter object with the primary key
from the former. Instead it just generate next value from the sequence. Why
is it the case ?
from sqlalchemy import create_enginefrom sqlalchemy.orm import sessionmaker
engine = create_engine("postgresql+psycopg2://psql_admin:***@localhost/fm")
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy import Integer, ForeignKey, VARCHAR, TEXT, Boolean, DateTimefrom sqlalchemy.orm import relationshipfrom sqlalchemy.sql.schema import Column
class B(Base):
__tablename__='B'
id_=Column(Integer, primary_key=True)
data = Column(VARCHAR(30))
class Rel(Base):
__tablename__='Rel'
id_a=Column(Integer, primary_key=True)
id_b=Column(Integer, ForeignKey('B.id_'), primary_key=True)
b = relationship(B)
rel_data=Column(VARCHAR(30))
Session = sessionmaker(bind=engine)
session = Session()Base.metadata.create_all(engine, checkfirst=True)
first_b=B(id_=1, data='ololo')
session.add(first_b)
session.commit()
session.add(Rel(id_a=800,id_b=1, rel_data='first relation data'))
second_b=B(data='foooo')
session.add(second_b)
x=session.merge(Rel(id_a=800, rel_data="second", b=second_b))
session.commit()
Here I have an error
IntegrityError: (raised as a result of Query-invoked autoflush; consider
using a session.no_autoflush block if this flush is occuring prematurely)
(IntegrityError) duplicate key value violates unique constraint "B_pkey"
DETAIL: Key (id_)=(1) already exists. 'INSERT INTO "B" (data) VALUES
(%(data)s) RETURNING "B".id_' {'data': 'foooo'}
primary key yet, but will obtain it upon flush) and I merge to that session
another object referring to the first one by relationship (*b* in the
example) SQLAlchemy doesn't populate latter object with the primary key
from the former. Instead it just generate next value from the sequence. Why
is it the case ?
from sqlalchemy import create_enginefrom sqlalchemy.orm import sessionmaker
engine = create_engine("postgresql+psycopg2://psql_admin:***@localhost/fm")
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy import Integer, ForeignKey, VARCHAR, TEXT, Boolean, DateTimefrom sqlalchemy.orm import relationshipfrom sqlalchemy.sql.schema import Column
class B(Base):
__tablename__='B'
id_=Column(Integer, primary_key=True)
data = Column(VARCHAR(30))
class Rel(Base):
__tablename__='Rel'
id_a=Column(Integer, primary_key=True)
id_b=Column(Integer, ForeignKey('B.id_'), primary_key=True)
b = relationship(B)
rel_data=Column(VARCHAR(30))
Session = sessionmaker(bind=engine)
session = Session()Base.metadata.create_all(engine, checkfirst=True)
first_b=B(id_=1, data='ololo')
session.add(first_b)
session.commit()
session.add(Rel(id_a=800,id_b=1, rel_data='first relation data'))
second_b=B(data='foooo')
session.add(second_b)
x=session.merge(Rel(id_a=800, rel_data="second", b=second_b))
session.commit()
Here I have an error
IntegrityError: (raised as a result of Query-invoked autoflush; consider
using a session.no_autoflush block if this flush is occuring prematurely)
(IntegrityError) duplicate key value violates unique constraint "B_pkey"
DETAIL: Key (id_)=(1) already exists. 'INSERT INTO "B" (data) VALUES
(%(data)s) RETURNING "B".id_' {'data': 'foooo'}
--
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+***@googlegroups.com.
To post to this group, send email to ***@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.
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+***@googlegroups.com.
To post to this group, send email to ***@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.