Я столкнулся с очень странной проблемой с SQLAlchemy.У меня есть модель, которая ссылается на себя (отношение списка смежности).Я просто скопировал модель (Node) из учебника по SQLAlchemy.Вот код модели:
class Node(Base):
__tablename__ = 'nodes'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('nodes.id'))
parent = Column(Unicode(50))
children = relationship('Node',
cascade="all", #tried to remove this
backref=backref("parent", remote_side='Node.id'),
collection_class=attribute_mapped_collection('data'), #tried to remove this as well
)
Я воспроизвел проблему в своих контроллерах, но я также запустил этот тест (после полной загрузки среды):
parent = Node()
parent.id = 1
parent.parent_id = None
parent.name = 'parent'
Session.add(parent)
child = Node()
child.id = 20
child.parent_id = 1
child.name = 'child'
Session.add(child)
Session.commit()
Вышекод работает просто отлично (изменения успешно фиксируются и отражаются в БД).
Проблема возникает, когда я изменяю идентификатор узла parent
на 0 (и parent_id child
на 0 соответственно),Затем я получаю следующее исключение:
......
File "C:\Python26\Lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
sqlalchemy.exc.IntegrityError: (IntegrityError) (1452, 'Cannot add or update a child row: a
foreign key constraint fails (`db`.`nodes`, CONSTRAINT `nodes_ibfk_1` FOREIGN KEY
(`parent_id`) REFERENCES `nodes` (`id`))') 'INSERT INTO nodes (id, parent_id, name) VALUES
(%s, %s, %s)' (20, 0, 'child')
Удивительно, но меняя это значение (идентификатор node
и идентификатор родительского элемента child
) на что угодно , но 0 (-5, 1 и 150) ошибка исчезнет.
Я что-то упускаю из виду?Нельзя ли присвоить 0 самоссылающемуся столбцу целочисленных идентификаторов?
Спасибо!