如何修复sqlalchemy.exc.InvalidRequestError:一个或多个映射程序未能初始化。。。最初的例外是:viewonly

2024-10-03 06:18:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下app.py:

from flask import Flask
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.dialects.postgresql import JSON
import os
from psycopg2.extras import Json, DictCursor


class Config(object):
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'secret_key'
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 
    'postgresql+psycopg2://postgres:password@localhost:5432/gkrs_test'


app = Flask(__name__)
app.config.from_object(Config)
bootstrap = Bootstrap(app)
db = SQLAlchemy(app)


class Teacher(db.Model):
    __tablename__ = 'teacher'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True)
    email = db.Column(db.String(120), unique=True)
    password_hash = db.Column(db.String(128))
    classes = db.relationship('Classes', back_populates='teacher', lazy='dynamic')


class Classes(db.Model):
    __tablename__ = 'classes'
    id = db.Column(db.Integer, primary_key=True)
    teacher = db.Column(db.Integer, db.ForeignKey('teacher.id'))
    name = db.Column(db.String(20))
    day = db.Column(db.String(20))
    time = db.Column(db.String(20))
    students = db.Column(JSON)


class Viktorina(db.Model):
    __tablename__ = 'viktorina'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20))
    teacher = db.Column(db.Integer, db.ForeignKey('teacher.id'))
    questions = db.Column(JSON)

当我转到python控制台并使用:

>>>from app import db
>>>from app import Teacher, Classes, Viktorina
>>>Teacher.query.get(1)

我得到以下例外情况:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Users\Vlad\PycharmProjects\gkrs-viktorina\venv\lib\site-packages\flask_sqlalchemy\__init__.py", line 512, in __get__
    mapper = orm.class_mapper(type)
  File "C:\Users\Vlad\PycharmProjects\gkrs-viktorina\venv\lib\site-packages\sqlalchemy\orm\base.py", line 451, in class_mapper
    mapper = _inspect_mapped_class(class_, configure=configure)
  File "C:\Users\Vlad\PycharmProjects\gkrs-viktorina\venv\lib\site-packages\sqlalchemy\orm\base.py", line 430, in _inspect_mapped_class
    mapper._configure_all()
  File "C:\Users\Vlad\PycharmProjects\gkrs-viktorina\venv\lib\site-packages\sqlalchemy\orm\mapper.py", line 1352, in _configure_all
    configure_mappers()
  File "C:\Users\Vlad\PycharmProjects\gkrs-viktorina\venv\lib\site-packages\sqlalchemy\orm\mapper.py", line 3295, in configure_mappers
    raise e
sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Triggering mapper: 'mapped class Teacher->teacher'. Original exception was: viewonly

我确信这些表并不是空的,它们至少都有一行。 我如何解决这个问题?我正在使用Postgresql。 我在网上找到的东西都没有用,因为它们都没有viewonly例外


Tags: frompyimportappdbstringsqlalchemyline
1条回答
网友
1楼 · 发布于 2024-10-03 06:18:40

在这一行

classes = db.relationship('Classes', back_populates='teacher', lazy='dynamic')

您告诉SQLAlchemy在“Classes”模型中创建字段“teacher”,但由于此行原因,该字段已存在于Classes模型中:

teacher = db.Column(db.Integer, db.ForeignKey('teacher.id'))

也许你是想叫班上的那个模范教师

相关问题 更多 >