【问题标题】:sqlalchemy UnmappedColumnError when inserting into many-to-many records插入多对多记录时的sqlalchemy UnmappedColumnError
【发布时间】:2018-07-28 21:10:24
【问题描述】:

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

当我从 db 关系中删除 primaryjoinsecondaryjoin 行并使用此方法时,我不会遇到相同的错误,并且确实插入了数据。

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

【问题讨论】:

    标签: python sqlalchemy many-to-many flask-sqlalchemy


    【解决方案1】:

    在这段代码中:

    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),
    

    【讨论】:

    • 能否对此进行一些扩展?我不太明白在哪里错误地引用了 id。
    • 这样更好吗?
    • 为什么投反对票?这为我解决了这个问题。好吧,它在使用正在定义的类名限定的 id 上给出错误——在给定的示例中,Course.id--,但不需要限定。
    猜你喜欢
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2013-05-02
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 2014-10-29
    相关资源
    最近更新 更多