[Sqlalchemy-tickets] [sqlalchemy] #2820: session.merge/nullable primary keys - FlushError: Can't up
Brought to you by:
zzzeek
|
From: sqlalchemy <mi...@zz...> - 2013-09-06 04:36:31
|
#2820: session.merge/nullable primary keys - FlushError: Can't update table using
NULL for primary key value
------------------------+-----------------------------------------
Reporter: elsdoerfer | Owner: zzzeek
Type: defect | Status: new
Priority: medium | Milestone:
Component: orm | Severity: no triage selected yet
Keywords: | Progress State: awaiting triage
------------------------+-----------------------------------------
SQLAlchemy==0.8.2
I believe this is a bug:
{{{
Traceback (most recent call last):
File "test.py", line 42, in <module>
session.commit()
File "/Users/michael/.virtualenvs/cms/lib/python2.7/site-
packages/sqlalchemy/orm/session.py", line 721, in commit
self.transaction.commit()
File "/Users/michael/.virtualenvs/cms/lib/python2.7/site-
packages/sqlalchemy/orm/session.py", line 354, in commit
self._prepare_impl()
File "/Users/michael/.virtualenvs/cms/lib/python2.7/site-
packages/sqlalchemy/orm/session.py", line 334, in _prepare_impl
self.session.flush()
File "/Users/michael/.virtualenvs/cms/lib/python2.7/site-
packages/sqlalchemy/orm/session.py", line 1818, in flush
self._flush(objects)
File "/Users/michael/.virtualenvs/cms/lib/python2.7/site-
packages/sqlalchemy/orm/session.py", line 1936, in _flush
transaction.rollback(_capture_exception=True)
File "/Users/michael/.virtualenvs/cms/lib/python2.7/site-
packages/sqlalchemy/util/langhelpers.py", line 58, in __exit__
compat.reraise(exc_type, exc_value, exc_tb)
File "/Users/michael/.virtualenvs/cms/lib/python2.7/site-
packages/sqlalchemy/orm/session.py", line 1900, in _flush
flush_context.execute()
File "/Users/michael/.virtualenvs/cms/lib/python2.7/site-
packages/sqlalchemy/orm/unitofwork.py", line 372, in execute
rec.execute(self)
File "/Users/michael/.virtualenvs/cms/lib/python2.7/site-
packages/sqlalchemy/orm/unitofwork.py", line 525, in execute
uow
File "/Users/michael/.virtualenvs/cms/lib/python2.7/site-
packages/sqlalchemy/orm/persistence.py", line 54, in save_obj
table, states_to_update)
File "/Users/michael/.virtualenvs/cms/lib/python2.7/site-
packages/sqlalchemy/orm/persistence.py", line 383, in
_collect_update_commands
"Can't update table "
sqlalchemy.orm.exc.FlushError: Can't update table using NULL for primary
key value
}}}
This is the code that triggers this:
{{{
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base()
class Related(Base):
__tablename__ = 'related'
parent = Column(Integer, ForeignKey("parent.id"))
key1 = Column(Integer, primary_key=True, nullable=True)
key2 = Column(Integer, primary_key=True, nullable=True)
def __init__(self, key1, key2):
self.key1, self.key2 = key1, key2
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
related = relationship(Related, collection_class=set)
Base.metadata.create_all(engine)
# First object
parent = Parent()
parent.id = 1
parent.related.add(Related(3, None))
session.add(parent)
session.commit()
# Update first object
parent = Parent()
parent.id = 1
parent.related.add(Related(2, None))
session.merge(parent)
session.commit()
}}}
--
Ticket URL: <http://www.sqlalchemy.org/trac/ticket/2820>
sqlalchemy <http://www.sqlalchemy.org/>
The Database Toolkit for Python
|