InvalidRequestError flask -sqlalchemy. Не могу создать таблицу SQLite - PullRequest
0 голосов
/ 06 февраля 2020

Я новичок в flask и SQLite и очень мало знаю о том, как они работают.

Models.py

from datetime import datetime
from flaskblog import db, login_manager
from flask_login import UserMixin


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


class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    posts = db.relationship('Post', backref='author', lazy=True)
    image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
    password = db.Column(db.String(60), nullable=False)

    def __repr__(self):
        return f"User('{self.username}', '{self.email}', '{self.image_file}')"


class PostIntmath(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    content = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    def __repr__(self):
        return f"Post('{self.title}', '{self.date_posted}')"

Это модели, которые я определил.

Я не знаю, почему это неправильно, но это дает мне InvalidRequestErrors.

sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Triggering mapper: 'mapped class User->user'. Original exception was: When initializing mapper mapped class User->user, expression 'Post' failed to locate a name ("name 'Post' is not defined"). If this is a class name, consider adding this relationship() to the <class 'flaskblog.models.User'> class after both dependent classes have been defined.

Мой полный проект на https://github.com/MGeureka/flask_web_app HELP !!!

1 Ответ

0 голосов
/ 06 февраля 2020

При объявлении отношения вы должны использовать имя класса в точности так, как оно указано в определении класса.

Причина, по которой SQL Алхимия не может найти «Пост», заключается в том, что вы использовали вместо этого «PostIntmath».

Измените эту строку

posts = db.relationship('Post', backref='author', lazy=True)

на

posts = db.relationship('PostIntmath', backref='author', lazy=True)

И ваша ошибка исчезнет go.

SQL Алхимия позволяет таким образом определять класс отображаемых отношений со строкой, чтобы эти классы могли находиться в отдельных файлах и при этом работать без необходимости импорта. За кулисами библиотека ищет все таблицы, связанные с объектом db, и пытается найти таблицу, которая соответствует указанному вами имени строки отношения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...