繁体   English   中英

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

[英]sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed

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

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) 唯一约束失败:teacher.full_name

我怎么解决这个问题?

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

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

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM