【问题标题】:sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database filesqlalchemy.exc.OperationalError: (sqlite3.OperationalError) 无法打开数据库文件
【发布时间】:2021-10-19 20:54:35
【问题描述】:

我正在尝试制作一个 RESTful 博客。

当我向我的博客添加“新帖子”时出现问题,它返回以下错误。

我已经尝试用谷歌搜索这个问题几个小时了,但找不到任何解决方案。

代码可以从数据库中读取数据,我所有的路由都可以正常工作,除了应该添加数据的 create_new_post 路由。

我已经缩小了似乎是数据库路径的问题,但我似乎无法弄清楚它有什么问题。

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file [SQL: INSERT INTO blog_post (title, subtitle, date, body, author, img_url) VALUES (?, ?, ?, ?, ?, ?)] [parameters: ('Blog Post Title', 'Subtitle goes here', 'August 18, 2021', '<p>BLog Content content</p>\r\n', 'Your Name', 'https://images.unsplash.com/photo-1629103257407-6eee51452cbd?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=701&q=80')] (Background on this error at: http://sqlalche.me/e/13/e3q8)

from flask import Flask, render_template, redirect, url_for
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired, URL
from flask_ckeditor import CKEditor, CKEditorField
from datetime import datetime, date

app = Flask(__name__)


##CONNECT TO DB
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///posts.db'
db = SQLAlchemy(app)

app.config['SECRET_KEY'] = '8BYkEfBA6O6donzWlSihBXox7C0sKR6b'
ckeditor = CKEditor(app)
Bootstrap(app)

# Returns the current year to be passed on the jinja templates. Used in website's footer
@app.context_processor
def inject_now():
    return {"now": datetime.utcnow()}


##CONFIGURE TABLE
class BlogPost(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(250), unique=True, nullable=False)
    subtitle = db.Column(db.String(250), nullable=False)
    date = db.Column(db.String(250), nullable=False)
    body = db.Column(db.Text, nullable=False)
    author = db.Column(db.String(250), nullable=False)
    img_url = db.Column(db.String(250), nullable=False)

    


##WTForm
class CreatePostForm(FlaskForm):
    title = StringField("Blog Post Title", validators=[DataRequired()])
    subtitle = StringField("Subtitle", validators=[DataRequired()])
    author = StringField("Your Name", validators=[DataRequired()])
    img_url = StringField("Blog Image URL", validators=[DataRequired(), URL()])
    body = CKEditorField("Blog Content", validators=[DataRequired()])
    submit = SubmitField("Submit Post")


##CKEditor


@app.route('/')
@app.route('/index')
def get_all_posts():
    posts = BlogPost.query.all()
    return render_template("index.html", all_posts=posts)


@app.route("/post/<int:post_id>")
def show_post(post_id):
    requested_post = BlogPost.query.get(post_id)
    return render_template("post.html", post=requested_post)


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


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


@app.route("/new-post", methods=["GET", "POST"])
def create_new_post():
    form = CreatePostForm()
    if form.validate_on_submit():
        new_post = BlogPost(
            title=form.title.data,
            subtitle=form.subtitle.data,
            body=form.body.data,
            img_url=form.img_url.data,
            author=form.author.data,
            date=date.today().strftime("%B %d, %Y")
        )
        db.session.add(new_post)
        db.session.commit()
        return redirect(url_for("get_all_posts"))
    return render_template("make-post.html", form=form)


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

【问题讨论】:

  • 尝试使用完整的绝对路径,并确保您对文件及其所在文件夹具有写入权限。
  • @KlausD。我尝试了您的解决方案,但问题仍然存在。
  • 您在目录中找到您的posts.db 文件了吗??
  • 是的,我可以找到posts.db文件,读取数据库中的数据没有问题,只有在添加新数据时才会出现问题
  • 只是一个更新,我尝试在另一台笔记本电脑上运行相同的代码并且它工作,一定是因为我的旧笔记本电脑中有很多奇怪的东西,无论如何我已经重新格式化 Windows,现在它可以工作了

标签: python rest flask flask-sqlalchemy flask-restful


【解决方案1】:

请尝试输入数据库的确切路径。 你可以这样做;

import os
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI']="sqlite:///"+os.path.join(basedir, "posts.db")

对于上面的示例,如果数据库posts.db不存在,则将其创建到当前工作目录文件夹中,并创建与flask服务器的连接。

更多信息请参考here

【讨论】:

  • 请解释您的答案,以帮助解决问题。
  • basedir 这是您当前的工作目录。因此,如果您说 sqlite:///posts.dbsqlite 将找不到实际的数据库文件。 app.config['SQLALCHEMY_DATABASE_URI']="sqlite:///"+os.path.join(basedir, "posts.db") 这一行基本上是一个sqlite uri; sqlite:///+basedir+[database_file]。希望你能理解
猜你喜欢
  • 2011-12-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
相关资源
最近更新 更多