数据库 – 我在SQL炼金术中的关系有什么问题?

前端之家收集整理的这篇文章主要介绍了数据库 – 我在SQL炼金术中的关系有什么问题?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用sqlAlchemy与Flask来创建我的应用程序的关系.我最近重写了关系,无论我改变了什么,我都不断得到错误
  1. sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between
  2. parent/child tables on relationship CurriculumVersion.enrollments - there are
  3. no foreign keys linking these tables. Ensure that referencing columns are
  4. associated with a ForeignKey or ForeignKeyConstraint,or specify
  5. a 'primaryjoin' expression.

在我的车型上:

  1. class User(db.Model,AuthUser):
  2. id = db.Column(db.Integer,primary_key=True)
  3. tf_login = db.Column(db.String(255),unique=True,nullable=False) # can assume is an email
  4. password = db.Column(db.String(120),nullable=False)
  5. salt = db.Column(db.String(80))
  6. role = db.Column(db.String(80)) # for later when have different permission types
  7. zoho_contactid = db.Column(db.String(20),nullable=False)
  8. created_asof = db.Column(db.DateTime,default=datetime.datetime.utcnow)
  9. enrollments = db.relationship('Enrollment',backref='enrollment',lazy='dynamic')
  10. firstname = db.Column(db.String(80))
  11. lastname = db.Column(db.String(80))
  12.  
  13.  
  14. def __repr__(self):
  15. 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)
  16.  
  17. def __getstate__(self):
  18. return {
  19. 'id': self.id,'tf_login': self.tf_login,'firstname': self.firstname,'lastname': self.lastname,'role': self.role,'created_asof': self.created_asof,}
  20.  
  21. @classmethod
  22. def load_current_user(cls,apply_timeout=True):
  23. data = get_current_user_data(apply_timeout)
  24. if not data:
  25. return None
  26. return cls.query.filter(cls.email==data['email']).one()
  27. return '#%d Course Name: %s,Course Version: %s,Closing Date: %s' %(self.id,self.course_name,self.course_version,self.closing_date)
  28.  
  29. class Enrollment(db.Model,primary_key=True)
  30. user_id = db.Column(db.Integer,db.ForeignKey('user.id'))
  31. version_id = db.Column(db.Integer,db.ForeignKey('curriculumversion.id'))
  32. cohort_id = db.Column(db.Integer,db.ForeignKey('cohort.id'))
  33.  
  34. def __repr__(self):
  35. return '#%d User ID: %d Version ID: %d,Cohort ID: %d' %(self.id,self.user_id,self.version_id,self.cohort_id)
  36.  
  37. class Cohort(db.Model,primary_key=True)
  38. days_to_completion = db.Column(db.String(20))
  39. course_id = db.Column(db.Integer,db.ForeignKey('course.id'))
  40. enrollments = db.relationship('Enrollment',lazy='dynamic')
  41.  
  42. def __repr__(self):
  43. return '#%d Days To Completion: %s' %(self.id,self.days_to_completion)
  44.  
  45.  
  46. class CurriculumVersion(db.Model,primary_key=True)
  47. version_number = db.Column(db.String(6))
  48. date_implemented = db.Column(db.DateTime)
  49. course_id = db.Column(db.Integer,lazy='dynamic')
  50.  
  51. def __repr__(self):
  52. return '#%d Version Number: %s,Date Implemented: %s' %(self.id,self.version_number,self.date_implemented)
  53.  
  54. class Course(db.Model,primary_key=True)
  55. course_code = db.Column(db.String(20))
  56. course_name = db.Column(db.String(50))
  57. versions = db.relationship('CurriculumVersion',backref='version',lazy='dynamic')
  58. cohorts = db.relationship('Cohort',backref='cohort',lazy='dynamic')
  59.  
  60.  
  61. def __repr__(self):
  62. return '#%d Course Code: %s,Course Name: %s' %(self.id,self.course_code,self.course_name)

任何帮助将不胜感激!

解决方法

这个错误
  1. Could not determine join condition between parent/child tables on relationship CurriculumVersion.enrollments

意味着sqlAlchemy在注册中找不到一个适当的列用作关系中的外键.

您定义了外键,但您使用了不正确的表名. Flask-sqlAlchemy在创建表时将CamelCase类转换为camel_case,因此需要更改此值:

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

到这个:

  1. class Enrollment(db.Model,db.ForeignKey('curriculum_version.id'))
  2. #...

或者,您可以使用__tablename__属性来覆盖Flask-sqlAlchemy使用的默认命名约定.

猜你在找的MsSQL相关文章