Операционная ошибка при попытке создания новых таблиц - PullRequest
0 голосов
/ 20 ноября 2018

Итак, перед добавлением нескольких столбцов у меня были имя пользователя, пароль и адрес электронной почты, и все работало нормально.Но когда я попытался добавить еще несколько вещей, таких как возраст, пол, телефон и адрес, я получил эту ошибку:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: user [SQL: 'SELECT user.id AS user_id, user.username AS user_username, user.email AS user_email, user.password AS user_password, user.age AS user_age, user.gender AS user_gender, user.phone AS user_phone, user.address AS user_address \nFROM user \nWHERE user.username = ?\n LIMIT ? OFFSET ?'] [parameters: ('agam-kashyap', 1, 0)] (Background on this error at: http://sqlalche.me/e/e3q8)

Ошибка, кажется, в следующих строках:

@app.route("/register",methods = ['GET','POST'])
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        user = User(username=form.username.data, email = form.email.data, password = form.password.data, age = form.age.data, gender = form.gender.data, phone = form.phone.data, address = form.address.data)
        db.create_all()
        db.session.add(user)
        db.session.commit()
        return redirect(url_for('login'))
    return render_template('register.html', title= 'Register' , form = form)

Кроме того, вот мой класс пользователя:

class User(db.Model):
    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)
    password = db.Column(db.String(60), nullable=False)
    age = db.Column(db.String(3), nullable=False)
    gender = db.Column(db.String(6), nullable=False)
    phone = db.Column(db.String(10), nullable=False)
    address = db.Column(db.String(200), nullable=False)

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 20 ноября 2018

В соответствии с предложением Дейва У. Смита, ошибка, вероятно, связана с тем, что вы не выполняли никаких операций переноса базы данных, чтобы новые изменения вступили в силу.

Когда модель базы данных меняется, как и для вас, база данных, конечно, должна быть обновлена. Это то, что вы хотите сделать визуально.

Итак, вы должны заметить, что особенность SQLAlchemy в том, что он создает таблицы из моделей только тогда, когда они уже существуют .

Это означает, что если вы хотите добавить новые вещи в базу данных, изменить или удалить поля из вашей модели, вам придется уничтожить старые таблицы и воссоздать все с нуля .

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

Для SQLAlchemy есть отличный инструмент миграции баз данных, который я назвал: Alembic . Но так как вы используете Flask, вам не нужно напрямую манипулировать Alembic; Существует расширение Flask, которое обрабатывает миграции баз данных SQLAlchemy для приложений Flask с использованием Alembic: flask-migrate

Поскольку вы все еще новичок в Flask, я рекомендую этот превосходный урок Мигеля Гринберга: мега-урок по фляге - part-iv: база данных . Он научит вас основам, необходимым для работы с Flask SQLAlchemy

...