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

Posted

技术标签:

【中文标题】SQLAlchemy ORM 一对多关系未从数据库加载所有记录【英文标题】:SQLAlchemy ORM one-to-many relationship is not loading all records from DB 【发布时间】:2011-07-07 01:36:27 【问题描述】:

使用 SqlAlchemy ORM,我一直在尝试在子表中具有“子”记录的父表之间建立一对多的关系。表和映射器声明如下。问题是,当应该有很多记录时,只有一个子记录从数据库读取到“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】:

问题出在 child_table 定义中。我只将具有外键关系的字段定义为 child_table 的主键的一部分。但是,这些字段(field_1 和 field_2)并不是完整的主键。因此,SQLAlchemy 似乎只加载了一行。我添加了 field_3 和 field_4 来完全定义 child_table 的主键,然后 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

【讨论】:

以上是关于SQLAlchemy ORM 一对多关系未从数据库加载所有记录的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy 一对多关系澄清

Flask-SQLAlchemy 配置,处理对象-关系,一对多,多对多

SQLAlchemy(三):外键连表关系

ORM SQLAlchemy 表于表的关系

SQLAlchemy 增删改查 一对多 多对多

SQLAlchemy外键的使用