SQLAlchemy ORM一对多关系未加载所有数据库记录

1 投票
1 回答
749 浏览
提问于 2025-04-16 20:59

我在使用SqlAlchemy这个工具时,想要建立一个父表和子表之间的一对多关系,也就是说,父表里有多个“子”记录在子表中。下面是我设置的表和映射的代码。不过我遇到了一个问题,就是在“children”这个属性里,只能从数据库中读取到一个子记录,而实际上应该有很多记录。

child_table = Table('child_table', metadata_obj,
                    Column('field_1', Integer, ForeignKey('parent_table.field_1'),
                           primary_key=True),
                    Column('field_2', String, ForeignKey('parent_table.field_2'),
                           primary_key=True),
                    autoload=True
mapper(Parent_Class, parent_table, properties={
       'children': relation(Child_Class, lazy=False, # Eager load
                            primaryjoin=and_(child_table.c.field_1==parent_table.c.field_1,
                                             parent_table.c.field_2==parent_table.c.field_2),
                            backref="parents"),
                        })

1 个回答

1

问题出在子表的定义上。我只把有外键关系的字段定义为子表的主键的一部分。但是,这些字段(field_1 和 field_2)并不是完整的主键。所以,看起来 SQLAlchemy 只加载了一行数据。我把 field_3 和 field_4 加入到主键中,完整定义了子表的主键,然后 SQLAlchemy 就成功读取了所有记录。

child_table = Table('child_table', metadata_obj,
                    Column('field_1', Integer, ForeignKey('parent_table.field_1'),
                           primary_key=True),
                    Column('field_2', String, ForeignKey('parent_table.field_2'),
                           primary_key=True),
                    Column('field_3', String, primary_key=True),
                    Column('field_4', String, primary_key=True),
                    autoload=True

撰写回答