Саморефериращата таблица на SQLAlchemy не може да има 0 като основен индекс?

Срещнах много странен проблем с 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()

Горният код работи добре (промените са успешно ангажирани и отразени в DB).

Проблемът възниква, когато променя идентификатора на възела 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')

Изненадващо, промяната на тази стойност (ID на node и parent_id на child) на която и да е освен 0 (-5, 1 и 150) кара грешката да изчезне.

Пропускам ли нещо очевидно? Не е ли възможно да се присвои 0 на колона с идентификационен номер с целочислено саморефериране?

Благодаря!


person Raiders    schedule 20.04.2011    source източник
comment
Добре, някои изследвания показаха, че когато вмъкна стойност 0 като ID, MySQL разглежда моята id колона като последователност и я придвижва напред. Така че, ако нищо не е имало, той го задава на 1. Ако предишен ред е бил въведен с id 6, вмъкването на нов ред с id ако е 0 ще накара новия ред да има 7 като id. Някаква идея защо се случва това и как да го заобиколя??   -  person Raiders    schedule 20.04.2011
comment
Очевидно всичките ми Column(Integer, primary_key=True) колони са AUTO_INCREMENT по подразбиране. Как да отменя тази опция по подразбиране (освен изричното предаване на autoincrement=False?   -  person Raiders    schedule 20.04.2011


Отговори (1)


MySQL използва генерирани идентификатори, когато изрично подадете NULL или 0. Предайте autoincrement=False като аргумент на Column, за да деактивирате AUTO_INCREMENT.

person Denis Otkidach    schedule 20.04.2011