Skip to main content
 首页 » 编程设计

python之插入多对多记录时出现sqlalchemy UnmappedColumnError

2025年05月04日26wayfarer

我的 flask-sqlalchemy 模型中定义了以下多对多关系:

class Course:  
    ... 
    modules = db.relationship('Module', secondary=course_modules, 
        primaryjoin=(course_modules.c.course_id == id),   
        secondaryjoin=(course_modules.c.module_id == id), 
        backref=db.backref('courses', lazy='dynamic'), lazy='dynamic')  

module_course 表对象定义为:

course_modules=db.Table('course_modules', 
    db.Column('course_id', db.Integer, db.ForeignKey('course.id')), 
    db.Column('module_id', db.Integer, db.ForeignKey('module.id')) 
) 

当执行以下操作以在此表中创建记录时,我得到一个 sqlalchemy.orm.exc.UnmappedColumnError:

module = module_service.get_by_id(1) # returns a Module instance 
course.modules = [module] # course being a Course instance 
course.modules.all() 
 
sqlalchemy.orm.exc.UnmappedColumnError: Can't execute sync rule for   
source column 'course.id'; mapper 'Mapper|Module|module' does not map  
this column.  Try using an explicit `foreign_keys` collection which  
does not include destination column 'course_modules.module_id'  
(or use a viewonly=True relation).     

当我从数据库关系中删除 primaryjoin 和 secondaryjoin 行并使用此方法时,我没有遇到相同的错误,并且确实插入了数据。

为什么包含主要和次要连接条件会导致插入中断?是否有其他方法可以将数据插入到我应该使用的多对多关系中?

请您参考如下方法:

在这段代码中:

modules = db.relationship('Module', secondary=course_modules, 
    primaryjoin=(course_modules.c.course_id == id),   
    secondaryjoin=(course_modules.c.module_id == id), 
primaryjoin 和 secondaryjoin 中的

id 是指由于范围限定为 Course.id。您应该明确引用正确的 id 列,例如:

modules = db.relationship('Module', secondary=course_modules, 
    primaryjoin=(course_modules.c.course_id == Course.id),   
    secondaryjoin=(course_modules.c.module_id == Module.id),