0

我在使用 SQLAlchemy 时遇到了一个非常奇怪的问题。我有一个自引用的模型(邻接列表关系)。我只是从 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节点的 id 更改为 0 (相应地将child' 的 parent_id 更改为 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的 id 和child的 parent_id )更改为0 以外的任何值(-5、1 和 150)会使错误消失。

我错过了一些明显的东西吗?不能将 0 分配给自引用整数 id 列吗?

谢谢!

4

1 回答 1

0

NULL当您显式传递或时,MySQL 使用生成的 ID 0autoincrement=False作为参数传递给Columndissable AUTO_INCREMENT

于 2011-04-20T12:16:18.567 回答