Я столкнулся с ошибкой при запуске приложения 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'
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').
База данных Миграции:
выполните следующие команды, чтобы убедиться в актуальности схемы базы данных:
Проверено, что модель User и соответствующая таблица user создаются до AssignmentReminder в базе данных.
Проверенное состояние базы данных:
Использовал браузер базы данных (например, SQLite Browser или pgAdmin), чтобы убедиться, что пользовательская таблица существует и имеет правильную схему.
Попробована явная инициализация:
Добавлен ручной вызов db.create_all() в моем приложении Flask, чтобы убедиться, что все таблицы созданы:
[h4]Описание проблемы:[/h4] Я столкнулся с ошибкой при запуске приложения Flask. Ошибка возникает, когда я пытаюсь войти в систему, и, похоже, она связана с внешним ключом модели AssignmentReminder, ссылающимся на модель User. Вот отслеживание ошибок: [code]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' [/code] [h4]Соответствующий код:[/h4] Вот используемые модели: [b]Модель пользователя[/b] >: [code]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.
# Relationship teacher = db.relationship("User", backref="assignments") [/code] [h4]Где был объявлен модуль:[/h4] [code]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 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 [/code] [h4]Моя среда:[/h4] [list] [*]Flask: [Последняя версия Flask] [*] Flask-SQLAlchemy: [Последняя версия] [*]SQLAlchemy: [Последняя версия] [*]Python: [Последняя версия Python] [h4]Мой Вопрос:[/h4] Почему SQLAlchemy не может найти таблицу пользователя, хотя имя таблицы соответствует ссылке на внешний ключ? Как устранить эту ошибку? [h4]Дополнительный контекст:[/h4] Я использую Flask-Migrate для миграции баз данных. Модель User привязана к основной базе данных, а модель AssignmentReminder ссылается на эту таблицу. Что я пробовал? [list] [*][b]Проверено имя таблицы:[/b]
Проверено, что __tablename__ в модели User правильно установлено значение «user» и что внешний ключ в Модель AssignmentReminder ссылается на него как db.ForeignKey('user.id').
[*][b]База данных Миграции:[/b]
выполните следующие команды, чтобы убедиться в актуальности схемы базы данных: [code]flask db init flask db migrate flask db upgrade [/code] Я ожидал, что это создаст все необходимые таблицы ([code]user[/code] и присваивание_reminder) в базе данных.
[*][b]Порядок таблиц:[/b]
Проверено, что модель User и соответствующая таблица user создаются до AssignmentReminder в базе данных.
[*][b]Проверенное состояние базы данных:[/b]
Использовал браузер базы данных (например, SQLite Browser или pgAdmin), чтобы убедиться, что пользовательская таблица существует и имеет правильную схему.
[*] [b]Попробована явная инициализация:[/b]
Добавлен ручной вызов db.create_all() в моем приложении Flask, чтобы убедиться, что все таблицы созданы: [code]with app.app_context(): db.create_all() [/code] Ожидали, что это решит все проблемы с созданием отсутствующих таблиц.
[*]Проверенные связи:< /strong>
Проверено, что столбец Teacher_id в таблице назначения_напоминаний правильно ссылается на user.id.
[/list]
Что Ожидал ли я? Я ожидал, что внешний ключ в модели AssignmentReminder распознает таблицу user в базе данных. В частности:
[*]Ссылка db.ForeignKey('user.id') должна связывать Teacher_id в назначении_reminder с id в таблице user без каких-либо ошибок. [*]Приложение должно работать без проблем без ошибок NoReferencedTableError во время выполнения или входа в систему.