SQLAlchemy Onetomany,添加一个记录

2024-09-29 19:27:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于添加具有一对多关系的记录的查询。你知道吗

首先,这里是我的模型,我与project/suite/case/step有一个层次化的一对多关系。你知道吗

class Project(Base):
    """Project model for reportr"""
    __tablename__ = 'project'
    id = Column(Integer, primary_key=True)
    name = Column(String(80))

    #  Relationship definitions
    test_suites = relationship("TestSuite", backref="test_suite")

    def __repr__(self):
        return '<Project %r>' % self.name


class TestSuite(Base):
    """Test suite model for reportr"""
    __tablename__ = 'test_suite'
    id = Column(Integer, primary_key=True)
    name = Column(String(80))

    #  Relationship definitions
    project_id = Column(Integer, ForeignKey("project.id"))
    test_cases = relationship("TestCase", backref="test_case")

    def __repr__(self):
        return '<TestSuite %r>' % self.name


class TestCase(Base):
    """Test case model for reportr"""
    __tablename__ = 'test_case'
    id = Column(Integer, primary_key=True)
    name = Column(String(80))

    #  Relationship definitions
    test_suite_id = Column(Integer, ForeignKey("test_suite.id"))
    test_steps = relationship("TestStep", backref="test_step")

    def __repr__(self):
        return '<TestCase %r>' % self.name


class TestStep(Base):
    """Test step model for reportr"""
    __tablename__ = 'test_step'
    id = Column(Integer, primary_key=True)
    name = Column(String(80))

    #  Relationship definitions
    test_case_id = Column(Integer, ForeignKey("test_case.id"))

    def __repr__(self):
        return '<TestCase %r>' % self.name

我有一个函数,它接受一个字典,然后使用SQLAlchemy将信息存储在数据库中。你知道吗

def save(results):
    """Process the JSON file and save in the database"""
    test_json = json.load(results)
    session = init_session()

    for reportr in test_json['reportr']:
        for project in reportr['project']:
            prj = Project(name=project['name'])
            session.add(prj)
            print prj

            for suite in project['test_suite']:
                sui = TestSuite(name=suite['name'])
                sui.project_id = [prj]
                session.add(sui)
                print sui

                for case in suite['test_case']:
                    cas = TestCase(name=case['name'])
                    cas.test_suite_id = [sui]
                    session.add(cas)
                    print cas

                    for step in case['test_step']:
                        stp = TestStep(name=step['name'])
                        stp.test_case_id = [cas]
                        session.add(stp)
                        print stp

    session.commit()

以TestSuite为例。。。你知道吗

目前,我得到一个InterfaceError错误,因为我试图保存一个对象,而不是ID到project_idForeignKey中。。。如果我将prj.id存储到该字段中,这是固定的,但是prj.id直到我add()commit()更改之后才会填充。你知道吗

根据我的经验,我不应该承诺任何事情,直到所有的处理,但似乎我不能建立没有它的关系?你知道吗

我的问题是,我是不是走错了路?我如何添加一个TestSuite与一个父Project和一些子TestCases?你知道吗

谢谢你, 乔希


Tags: nameintestselfprojectidforsession

热门问题