Ошибка внешнего ключа SQLAlchemy: «Не удалось найти таблицу «пользователь» для назначения_напоминания.учителя_ид»Python

Программы на Python
Ответить
Anonymous
 Ошибка внешнего ключа SQLAlchemy: «Не удалось найти таблицу «пользователь» для назначения_напоминания.учителя_ид»

Сообщение Anonymous »

Описание проблемы:

Я столкнулся с ошибкой при запуске приложения Flask. Ошибка возникает, когда я пытаюсь войти в систему, и, похоже, она связана с внешним ключом модели AssignmentReminder, ссылающимся на модель User. Вот отслеживание ошибок:

Код: Выделить всё

sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'assignment_reminder.teacher_id' could not find table 'user' with which to generate a foreign key to target column 'id'

Соответствующий код:

Вот используемые модели:
Модель пользователя >:

Код: Выделить всё

class User(db.Model, UserMixin):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(150), nullable=False, unique=True)
email = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(128), nullable=False)
role = db.Column(db.String(20), nullable=False)  # e.g., 'student', 'teacher', etc.

def __repr__(self):
return f"User('{self.username}', '{self.email}', '{self.role}')"
Модель AssignmentReminder:

Код: Выделить всё

class AssignmentReminder(db.Model):
__tablename__ = 'assignment_reminder'
id = db.Column(db.Integer, primary_key=True)
teacher_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)  # Foreign key
assignment_details = db.Column(db.String(255), nullable=False)
title = db.Column(db.String(100), nullable=False)
description = db.Column(db.Text, nullable=False)
due_date = db.Column(db.DateTime, nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)

# Relationship
teacher = db.relationship("User", backref="assignments")

Где был объявлен модуль:

Код: Выделить всё

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_migrate import Migrate
from .models import User  # Ensure your User model is imported here
from .extensions import db, login_manager
from .routes import main  # Ensure this import is correct

# Initialize extensions
db = SQLAlchemy()
login_manager = LoginManager()
migrate = Migrate()

@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))

def create_app():
app = Flask(__name__)

# Configurations
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:Root1234!@localhost/school_hub'
app.config['SECRET_KEY'] = '8d8a72493996de3050b75e0737fecacf'
app.config['SESSION_PROTECTION'] = 'strong'
app.config['SQLALCHEMY_BINDS'] = {
'teacher_db': 'mysql+pymysql://root:Root1234!@localhost/teacher_database',
'student_db': 'mysql+pymysql://root:Root1234!@localhost/student_database',
}
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# Initialize extensions with the app
db.init_app(app)
login_manager.init_app(app)
login_manager.login_view = 'main.login'
migrate.init_app(app, db)

# Register Blueprint
app.register_blueprint(main)

# Create all tables if not exists
with app.app_context():
db.create_all()

return app

Моя среда:

  • Flask: [Последняя версия Flask]
  • Flask-SQLAlchemy: [Последняя версия]
  • SQLAlchemy: [Последняя версия]
  • Python: [Последняя версия Python]

    Мой Вопрос:

    Почему SQLAlchemy не может найти таблицу пользователя, хотя имя таблицы соответствует ссылке на внешний ключ? Как устранить эту ошибку?

    Дополнительный контекст:

    Я использую Flask-Migrate для миграции баз данных. Модель User привязана к основной базе данных, а модель AssignmentReminder ссылается на эту таблицу.
    Что я пробовал?
    • Проверено имя таблицы:

      Проверено, что __tablename__ в модели User правильно установлено значение «user» и что внешний ключ в Модель AssignmentReminder ссылается на него как db.ForeignKey('user.id').
    • База данных Миграции:

      выполните следующие команды, чтобы убедиться в актуальности схемы базы данных:

      Код: Выделить всё

      flask db init
      flask db migrate
      flask db upgrade
      
      Я ожидал, что это создаст все необходимые таблицы ( и присваивание_reminder) в базе данных.
    • Порядок таблиц:

      Проверено, что модель User и соответствующая таблица user создаются до AssignmentReminder в базе данных.
    • Проверенное состояние базы данных:

      Использовал браузер базы данных (например, SQLite Browser или pgAdmin), чтобы убедиться, что пользовательская таблица существует и имеет правильную схему.
    • Попробована явная инициализация:

      Добавлен ручной вызов db.create_all() в моем приложении Flask, чтобы убедиться, что все таблицы созданы:

      Код: Выделить всё

      with app.app_context():
      db.create_all()
      
      Ожидали, что это решит все проблемы с созданием отсутствующих таблиц.
    • Проверенные связи:< /strong>

      Проверено, что столбец Teacher_id в таблице назначения_напоминаний правильно ссылается на user.id.
    Что Ожидал ли я?
    Я ожидал, что внешний ключ в модели AssignmentReminder распознает таблицу user в базе данных. В частности:
  • Ссылка db.ForeignKey('user.id') должна связывать Teacher_id в назначении_reminder с id в таблице user без каких-либо ошибок.
  • Приложение должно работать без проблем без ошибок NoReferencedTableError во время выполнения или входа в систему.

    Подробнее здесь: https://stackoverflow.com/questions/792 ... ent-remind
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»