在插入多对多记录时出现sqlalchemy UnmappedColumnError

4 投票
1 回答
2385 浏览
提问于 2025-05-18 21:18

我在我的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).    

当我把primaryjoinsecondaryjoin这两行从数据库关系中去掉,使用其他方法时,就没有遇到同样的错误,数据也成功插入了。

那么,为什么加上主连接和次连接的条件会导致插入失败呢?有没有其他方法可以用来插入多对多关系的数据?

相关问题:

  • 暂无相关问题
暂无标签

1 个回答

5

在这段代码中:

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

id 在 primaryjoin 和 secondaryjoin 中由于作用域的关系,指的是 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),

撰写回答