Flask / Python: Sqlalchemy.exc.OperationalError

#python #flask #sqlalchemy

#python #flask #sqlalchemy

Вопрос:

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

 
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime




 
app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////Users/admin/Desktop/Blog_Project/blog2.db'

db = SQLAlchemy(app)

class Blogpost(db.Model):

    id = db.Column(db.Integer, primary_key = True)
    title = db.Column(db.String(50))
    subtitle = db.Column(db.String(50))
    author = db.Column(db.String(20))
    date_posted = db.Column(db.DateTime)
    content = db.Column(db.Text)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/about')
def about():
    return render_template('about.html')
    

@app.route('/post')
def post():
    return render_template('post.html')


@app.route('/contact')
def contact():
    return render_template('contact.html')


@app.route('/prova')
def prova():
    return render_template('prova.html')


@app.route('/add')
def add():
    return render_template('add.html')

@app.route('/addpost', methods=['POST'])
def addpost():
    
    title = request.form['title']
    subtitle = request.form['subtitle']
    author = request.form["author"]
    content = request.form['content']


    
    post = Blogpost(title=title, subtitle=subtitle, author=author, content=content, date_posted = datetime.now())


    db.session.add(post)
    db.session.commit()
    

    return redirect(url_for('index'))




if __name__ == "__main__":
    app.run(debug = True)

  

И это ошибка, которую я получаю:

 sqlalchemy.exc.OperationalError

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: blogpost
[SQL: INSERT INTO blogpost (title, subtitle, author, date_posted, content) VALUES (?, ?, ?, ?, ?)]
[parameters: ('ds', 'ds', 'sd', '2020-09-08 12:55:25.333277', 'ds')]
(Background on this error at: http://sqlalche.me/e/13/e3q8)

  

Насколько я понимаю, проблема в том, что Flask не может создать таблицу blogpost в базе данных blog2 и заполнить ее значениями, которые я вставил в код. Я прочитал некоторую документацию в Интернете и в Stackoverflow, и, по-видимому, некоторые люди исправили ту же проблему с помощью метода db.create_all() , но я не уверен, куда мне следует ее вставить или следует ли мне реорганизовать код другим способом. У вас есть какие-либо предложения? Заранее большое вам спасибо!

Комментарии:

1. Сначала вы должны создать базу данных (я имею в виду, добавить в нее таблицы)

2. Вы имеете в виду, создавать их вручную? Не должно ли это происходить непосредственно через код?

3. В необработанном sqlalchemy, если вы не выдадите Base.metadata.create_all , это не будет сделано автоматически. Я мало что знаю о плагине flask-sqlalchemy, но, за исключением случаев, указанных другим способом, вы действительно должны docs.sqlalchemy.org/en/13/orm/tutorial.html#create-a-schema

4. Хорошо, я попробую. Спасибо за объяснение!

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