簡體   English   中英

Sqlalchemy 錯誤:sqlalchemy.exc.NoReferencedTableError

[英]Sqlalchemy Error: sqlalchemy.exc.NoReferencedTableError

我需要使用 sqlalchemy 創建 4 個表,學生,科目,考試和分數。

執行分數,另一個可以創建。 我使用了參數 back_populates 和 backref,但兩者都不起作用。

它顯示此錯誤

sqlalchemy.exc.NoReferencedTableError: 
    Foreign key associated with column 'score.subject_id' could not find table 'subject' with 
    which to generate a foreign key to target column 'id'

有我的代碼首先導入和 somebase

from sqlalchemy import Column, ForeignKey, Integer, String, Boolean, Date, Float, Table
from sqlalchemy import UniqueConstraint, create_engine
from sqlalchemy.orm import relationship, declarative_base, sessionmaker


StudentBase = declarative_base()
SubjectBase = declarative_base()
ExamBase = declarative_base()
ScoreBase = declarative_base()

表:學生

class Student(StudentBase):
    __tablename__ = 'student'

    id = Column(Integer, primary_key=True)
    student_id = Column(String(8), unique=True, nullable=False)
    name = Column(String(20), nullable=False)
    number = Column(Integer, nullable=False)
    grade = Column(Integer, nullable=False)
    class_ = Column("class", Integer, nullable=False)

    UniqueConstraint(number, grade, class_, name='basic_info')
    stid = relationship("Score", back_populates="strs")

    def __init__(self, student_id, name, number, grade, class_):
        self.student_id = student_id
        self.name = name
        self.number = number
        self.grade = grade
        self.class_ = class_

    def __repr__(self):
        return "<student('%s', '%s', '%d', '%d')>" % (self.student_id, self.name, self.grade, self.class_)

表:主題

class Subject(SubjectBase):
    __tablename__ = 'subject'

    id = Column(Integer, primary_key=True)
    name = Column(String(30), nullable=False)
    grade = Column(Integer, nullable=False)

    UniqueConstraint(name, grade, name='subject_limit')
    suid = relationship("Score", back_populates="surs")

    def __init__(self, name, grade):
        self.name = name
        self.grade = grade
    
    def __repr__(self):
        return "<subject(%s, %d)>" % (self.name, self.grade)

表:考試

class Exam(ExamBase):
    __tablename__ = "exam"

    id = Column("id", Integer, primary_key=True)
    name = Column("name", String(30), nullable=False)

    exid = relationship("Score", back_populates="exrs")

    def __init__(self, name):
        self.name = name
    
    def __repr__(self):
        return "<exam(%s)>" % (self.name)


class Score(ScoreBase):
    __tablename__ = "score"

    id = Column(Integer, primary_key=True)
    student_id = Column(ForeignKey("student.id"), nullable=False)
    subject_id = Column(ForeignKey("subject.id"), nullable=False)
    exam_id = Column(ForeignKey("exam.id"), nullable=False)
    score = Column(Float, nullable=False)

    strs = relationship("Student", back_populates="stid")
    surs = relationship("Subject", back_populates="suid")
    exrs = relationship("Exam", back_populates="exid")
    

    def __init__(self, student_id, subject_id, exam_id ,score):
        self.student_id = student_id
        self.subject_id = subject_id
        self.exam_id = exam_id
        self.score = score
    
    def __repr__(self):
        return "<score(%d, %d, %d, %.2f)>" % (self.student_id, self.subject_id, self.exam_id, self.score)

主要的

if __name__ == "__main__":
    engine = create_engine('some sqlinfo')
    
    StudentBase.metadata.create_all(engine)
    SubjectBase.metadata.create_all(engine)
    ExamBase.metadata.create_all(engine)
    ScoreBase.metadata.create_all(engine)

我該如何解決這個問題,謝謝。

首先,你只需要一個

Base = declarative_base()

並且學生和主題表不是任何 ForeignKey 例如: https://docs.sqlalchemy.org/en/14/orm/basic_relationships.html#one-to-many

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM