【问题标题】:flask sqlalchemy cannot create table烧瓶 sqlalchemy 无法创建表
【发布时间】:2018-10-22 14:50:36
【问题描述】:

我是python的新手。我正在尝试创建表并练习如何使用 Flask-SQLAlchemy 进行声明性模型。当我运行db.create_all() 时,出现以下错误。我不确定哪一部分是错的。希望有经验的可以帮帮我。

sqlalchemy.exc.ArgumentError: Mapper Mapper|TeacherUser|teacher_user could not assemble any primary key columns for mapped table 'teacher_user'
  • user -> search_condition 一对一
  • user teacher是多对多,teacherUser是这两个表之间的关系表。
  • 用户 -> 类是多对一
  • 用户 -> 书是一对多

这是我的模型架构

from flaskr import db
from sqlalchemy import text
from datetime import datetime
from sqlalchemy.dialects.mysql import ENUM, JSON


class User(db.Model):
    __tablename__ = 'user'
    user_id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), unique=True, nullable=False)
    search_condition = db.relationship('SearchCondition', uselist=False, backref='user')

    teachers = db.relationship('TeacherUser', backref=db.backref('users', lazy='joined'), lazy='dynamic')

    class_id = db.Column(db.Integer, db.ForeignKey('classes.id'))
    classes = db.relationship('Classes', backref='classes')

    books = db.relationship('Book',backref='book')

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<Demo %r>' % self.username

    def save(self):
        db.session.add(self)
        db.session.commit()


class SearchCondition(db.Model):
    __tablename__ = 'search_condition'
    search_condition_id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.user_id'))
    condition = db.Column(JSON, server_default=text(r"{}"))


class TeacherUser(db.Model):
    __tablename__ = 'teacher_user'
    user_id = db.Column(db.Integer, db.ForeignKey('user.user_id'))
    teacher_id = db.Column(db.Integer, db.ForeignKey('teacher.teacher_id'))


class Teacher(db.Model):
    __tablename__ = 'teacher'
    teacher_id = db.Column(db.Integer, primary_key=True)
    participants = db.relationship('TeacherUser', backref=db.backref('teachers', lazy='joined'), lazy='dynamic')


class Classes(db.Model):
    __tablename__ = 'classes'
    class_id = db.Column(db.Integer, primary_key=True)


class Book(db.Model):
    __tablename__ = 'book'
    book_id = db.Column(db.Integer, primary_key=True)
    own_id = db.Colum(db.Integer,db.ForeignKey('user.id'))

【问题讨论】:

  • 您需要为表teacher_user添加主列

标签: python sqlalchemy flask-sqlalchemy


【解决方案1】:

为您的模型添加复合主键

class TeacherUser(db.Model):
    __tablename__ = 'teacher_user'
    user_id = db.Column(db.Integer, db.ForeignKey('user.user_id'), primary_key=True)
    teacher_id = db.Column(db.Integer, db.ForeignKey('teacher.teacher_id'), primary_key=True)

【讨论】:

  • 我添加了primary_key。但我得到了这个sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1215, 'Cannot add foreign key constraint') [SQL: '\nCREATE TABLE teacher_user (\n\tuser_id INTEGER NOT NULL, \n\tteacher_id INTEGER NOT NULL, \n\tPRIMARY KEY (user_id, teacher_id), \n\tFOREIGN KEY(user_id) REFERENCES user (user_id), \n\tFOREIGN KEY(teacher_id) REFERENCES teacher (teacher_id)\n)\n\n'] (Background on this error at: http://sqlalche.me/e/gkpj)
猜你喜欢
  • 1970-01-01
  • 2021-02-21
  • 2012-12-29
  • 2014-07-20
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
相关资源
最近更新 更多