当前位置: 首页 > 面试题库 >

我在SQL Alchemy中的关系有什么问题?

牟正真
2023-03-14
问题内容

我将SQLAlchemy与Flask一起使用来为我的应用程序创建关系。我最近重新编写了关系,并且,无论我进行了什么更改,我都会不断收到错误消息:

sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between 
parent/child tables on relationship CurriculumVersion.enrollments - there are 
no foreign keys linking these tables.  Ensure that referencing columns are 
associated with a ForeignKey or ForeignKeyConstraint, or specify
a 'primaryjoin' expression.

在我的模型上:

class User(db.Model, AuthUser):
    id = db.Column(db.Integer, primary_key=True)
    tf_login = db.Column(db.String(255), unique=True, nullable=False) # can assume is an email
    password = db.Column(db.String(120), nullable=False)
    salt = db.Column(db.String(80))
    role = db.Column(db.String(80)) # for later when have different permission types
    zoho_contactid = db.Column(db.String(20), unique=True, nullable=False)
    created_asof = db.Column(db.DateTime, default=datetime.datetime.utcnow)
    enrollments = db.relationship('Enrollment', backref='enrollment', lazy='dynamic')
    firstname = db.Column(db.String(80))
    lastname = db.Column(db.String(80))


    def __repr__(self):
        return '#%d tf_login: %s, First Name: %s Last Name: %s created_asof %s' % (self.id, self.tf_login, self.firstname, self.lastname, self.created_asof)

    def __getstate__(self):
        return {
            'id': self.id,
            'tf_login': self.tf_login,
            'firstname': self.firstname,
            'lastname': self.lastname,
            'role': self.role,
            'created_asof': self.created_asof,
        }

    @classmethod
    def load_current_user(cls, apply_timeout=True):
        data = get_current_user_data(apply_timeout)
        if not data:
            return None
        return cls.query.filter(cls.email==data['email']).one()
        return '#%d Course Name: %s, Course Version: %s, Closing Date: %s' %(self.id, self.course_name, self.course_version, self.closing_date)

class Enrollment(db.Model, AuthUser):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    version_id = db.Column(db.Integer, db.ForeignKey('curriculumversion.id'))
    cohort_id = db.Column(db.Integer, db.ForeignKey('cohort.id'))

    def __repr__(self):
        return '#%d User ID: %d Version ID: %d, Cohort ID: %d' %(self.id, self.user_id, self.version_id, self.cohort_id)

class Cohort(db.Model, AuthUser):
    id = db.Column(db.Integer, primary_key=True)
    days_to_completion = db.Column(db.String(20))
    course_id = db.Column(db.Integer, db.ForeignKey('course.id'))
    enrollments = db.relationship('Enrollment', backref='enrollment', lazy='dynamic')

    def __repr__(self):
        return '#%d Days To Completion: %s' %(self.id, self.days_to_completion)


class CurriculumVersion(db.Model, AuthUser):
    id = db.Column(db.Integer, primary_key=True)
    version_number = db.Column(db.String(6))
    date_implemented = db.Column(db.DateTime)
    course_id = db.Column(db.Integer, db.ForeignKey('course.id'))
    enrollments = db.relationship('Enrollment', backref='enrollment', lazy='dynamic')

    def __repr__(self):
        return '#%d Version Number: %s, Date Implemented: %s' %(self.id, self.version_number, self.date_implemented)

class Course(db.Model, AuthUser):
    id = db.Column(db.Integer, primary_key=True)
    course_code = db.Column(db.String(20))
    course_name = db.Column(db.String(50))
    versions = db.relationship('CurriculumVersion', backref='version', lazy='dynamic')
    cohorts = db.relationship('Cohort', backref='cohort', lazy='dynamic')


    def __repr__(self):
        return '#%d Course Code: %s, Course Name: %s' %(self.id, self.course_code, self.course_name)

任何帮助,将不胜感激!


问题答案:

这个错误:

Could not determine join condition between parent/child tables on relationship CurriculumVersion.enrollments 

意味着SQLAlchemy在其中找不到合适的列Enrollments用作关系中的外键。

你定义了外键,但是使用了错误的表名。创建表时,Flask-SQLAlchemy会将CamelCase类转换为camel_case,因此你需要更改以下内容:

class Enrollment(db.Model, AuthUser):
    # ...
    version_id = db.Column(db.Integer, db.ForeignKey('curriculumversion.id'))
    #...

对此:

class Enrollment(db.Model, AuthUser):
    # ...
    version_id = db.Column(db.Integer, db.ForeignKey('curriculum_version.id'))
    #...

或者,你可以使用该__tablename__属性来覆盖Flask-SQLAlchemy使用的默认命名约定。



 类似资料:
  • 我拿不到输出。。有人能帮我得到输出吗 下面给出了程序运行的示例(注意:下面的粗体文本是用户输入的输入): 进入三角形的三个边

  • 问题内容: 我有一个带有和对象的简单模型。 一个问题有很多选择。 许多选择有一个问题 有两种使用Hibernate来实现的方法 实施一:所有者是选择 Question.java Choice.java 实施二:所有者方是质询 Question.java Choice.java 两种实现之间有什么区别? 问题答案: 第一个示例是正常且正确的双向一对多/多对一映射。设置为-attribute(“拥有方

  • 问题内容: 因此,问题的根源在于将XML数据存储在关系数据库中是否合适?通常有没有更好的方法来实现相同的目标?哪些数据库引擎为XML数据类型(例如SQL Server)提供了良好的支持,以及围绕“ XML索引”的问题是什么? 问题答案: 数据库用于存储数据。XML是数据。因此,在适当的情况下,将XML存储在数据库中是完全有效的。这是否是最有效的方法,取决于许多可能无法概括的因素。 例如,如果您有一

  • 问题内容: 运行此代码时,我不断收到此错误: 错误:大小写类型的字符不同,并且整数不能匹配 您可能会认为这不会造成问题,因为我正在查询中创建新列。我还想指出的是,如果有帮助,我正在使用旧版本的PostgreSQL。 问题答案:

  • 问题内容: 我是JAVA的新手,刚刚开始学习IS-A和HAS-A的关系,但学到的东西不多。我想想像一下这两者有何不同以及何时应使用IS-A和HAS-A? 问题答案: IS-A关系是继承。继承的类称为子类或子类。另一方面,HAS-A关系是组成。 在OOP中,IS-A关系是完全继承。这意味着子类是父类的一种。例如,苹果是水果。因此,您将扩展水果以获得苹果。 另一方面,组合意味着创建引用了其他对象的实例

  • 问题内容: 我考虑这个问题已有一段时间了,似乎找不到答案。Node.js和V8有什么关系?可以在没有V8的情况下使用Node.js吗? 问题答案: Node.js和V8有什么关系? V8是node.js内的Javascript引擎,用于解析和运行Javascript。Chrome内部使用了相同的V8引擎,以在Chrome浏览器中运行javascript。Google开源了V8引擎,node.js的