首页 > 解决方案 > SQL Alchemy:在同一会话中添加父项和子项时出现 DatabaseError

问题描述

当我同时从会话中刷新子项和父项时,SQL Alchemy 会引发 DatabaseError。

class Parent(Base):
    __tablename__ = 'parents'

    # Primary key - using two columns
    id = Column(Integer, primary_key=True, autoincrement=True)
    split_id = Column(Integer, primary_key=True, autoincrement=False, default=0, server_default='0')

    # Other columns...

class Child(Versioned, Base):
    __tablename__ = 'children'
    id = Column(Integer, primary_key=True, autoincrement=True)
    parent_id = Column(Parent.id.type, nullable=False)
    parent_split_id = Column(Parent.split_id.type, nullable=False)

    __table_args__ = (
        ForeignKeyConstraint(
            [parent_id, parent_split_id],
            [Parent.id, Parent.split_id],
            onupdate='cascade',
        ),
    )

    # Other columns...

    parent = relationship(
        'Parent',
        backref=backref('children'),
    )

parent = Parent()
parent.child = Child()

session.add(parent)
session.flush() # sqlalchemy.exc.DatabaseError: (mysql.connector.errors.DatabaseError) 1364 (HY000): Field 'child_id' doesn't have a default value

我正在解析一个电子表格,只需将所有新内容添加到会话中,然后在最后提交。我确保重用对象。但是在id我执行 a 之前不会分配session.flush(),当我执行时,session.flush()我的父对象也会被刷新,因为与 有关系backpopulates

处理这个问题的正确 sql alchemy 方法是什么?我在文档中找不到任何相关内容。一切都是为了建立关系。

编辑:使用类示例更新代码。就我而言,我使用复合主键,但这应该是一个问题。该错误抱怨孩子没有身份证。

标签: pythonsqlalchemy

解决方案


推荐阅读