sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) 唯一约束失败

时间:2021-04-02 18:32:46

标签: sql sqlite sqlalchemy flask-sqlalchemy

我正在尝试为某些课程创建表格,最后一列是另一个表格,并显示了讲师姓名。

class Teachers(Base):
    __tablename__ = 'teacher'
    full_name = Column(String, unique=False, primary_key=True)
    company = Column(String, unique = False)
    

class Course(Base):
    __tablename__ = 'course'
    course_name = Column(String, nullable=False)
    course_id = Column(String,primary_key=True)
    level = Column(String,unique=False)
    teachers = Teachers

但是当一位讲师的名字在不同的课程中重复时,我发现了以下问题:

sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE 约束失败:teacher.full_name

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您的 teachers 列不是列。相反,您将整个表添加为属性。

您应该做的是在 Course 中定义一列,其中包含 Teacher 的主键(假设每门课程只有一名教师)并将其标记为 ForeignKey .您还可以添加 relationship 以简化工作。

from pathlib import Path

import sqlalchemy.orm
from sqlalchemy import Column, String, ForeignKey, create_engine
from sqlalchemy.orm import declarative_base, relationship

Base = declarative_base()


class Teacher(Base):
    __tablename__ = "teachers"

    full_name = Column(String, unique=False, primary_key=True)
    company = Column(String, unique=False)


class Course(Base):
    __tablename__ = "courses"

    course_id = Column(String, primary_key=True)
    course_name = Column(String, nullable=False)
    level = Column(String, unique=False)
    teacher_name = Column(ForeignKey("teachers.full_name"))

    teacher = relationship("Teacher")


def main():
    if Path("test_database.db").exists():
        Path("test_database.db").unlink()

    engine = create_engine("sqlite:///test_database.db")

    Base.metadata.create_all(engine)

    session = sqlalchemy.orm.Session(autocommit=False, autoflush=False, bind=engine)

    teacher_1 = Teacher(full_name="Bob")

    course_1 = Course(course_id=1, course_name="Course 1", level="beginner", teacher=teacher_1)
    course_2 = Course(course_id=2, course_name="Course 2", level="advanced", teacher=teacher_1)

    session.add_all([course_1, course_2])
    session.commit()


if __name__ == "__main__":
    main()
相关问题