Database 我在SQL炼金术中的关系有什么问题?
我正在使用SQLAlchemy和Flask为我的应用程序创建关系。我最近重写了这些关系,无论我做了什么改变,我总是会出错:Database 我在SQL炼金术中的关系有什么问题?,database,sqlalchemy,flask,flask-sqlalchemy,Database,Sqlalchemy,Flask,Flask Sqlalchemy,我正在使用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
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)
任何帮助都将不胜感激 尝试在课程版本课程中使用primaryjoin,如下所示: 改变
enrollments = db.relationship('Enrollment', backref='enrollment', lazy='dynamic')
到
注意:您可能还需要对其他类执行此操作。此错误:
Could not determine join condition between parent/child tables on relationship CurriculumVersion.enrollments
意味着SQLAlchemy无法在注册中找到合适的列作为关系中的外键
您定义了外键,但使用了不正确的表名。Flask SQLAlchemy在创建表时将CamelCase
类转换为camel\u 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'))
#...
或者,您可以使用\uuuu tablename\uuuu
属性来覆盖Flask SQLAlchemy使用的默认命名约定。这会显示错误消息:“sqlalchemy.exc.NorReferencedTableError:与列'enrollment.version_id'关联的外键找不到表'CoursulumVersion',无法使用该表生成指向目标列'id'的外键”“有什么想法吗?您的示例中缺少了修复此问题的详细信息-示例中的ForeignKey指的是'CoursulumVersion.id',但出于某种原因,它正在寻找一个名为“CoursulumVersion”的表-db.Model到底做了什么,\uuuuuuTableName\uuuuuuuuu
,等等?这真的让我很生气。”。知道为什么会这样吗?因为Flask认为为您创建名称,而不是让开发人员显式地生成这些约定,会让您的生活更轻松。SQLAlchemy本身从不产生任何形式的约定,只是提供了一些工具来创建自己的约定。
class Enrollment(db.Model, AuthUser):
# ...
version_id = db.Column(db.Integer, db.ForeignKey('curriculum_version.id'))
#...