提问者:小点点

SQLAlchemy db.create_all()错误,未创建db


我无法按照flask教程创建数据库:https://www.youtube.com/watch?v=cywidiiuxqc&list=pl-osie80tets4ujlw5mm6ojgkjfeuxcyh&index=4

我没有找到解决这个问题的办法。请帮帮忙。

当我尝试在从项目导入数据库后运行db.create_all()时,我得到

SqlAlchemy.exc.OperationalError:(Sqlite3.OperationalError)无法打开数据库文件

Python 3.8.3

from datetime import datetime
from flask import Flask, render_template, url_for, flash, redirect
from flask_sqlalchemy import SQLAlchemy
from forms import RegistrationForm, LoginForm

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)

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)
    image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
    password = db.Column(db.String(60), nullable=False)
    posts = db.relationship('Post', backref='author', lazy=True)

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

class Post(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}')"

错误:

db.create_all()跟踪(最近一次调用):文件“/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/engine/base.py”,第2339行,在_wrap_pool_connect返回fn()文件“/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py”,在connect返回_connectionfairy._checkout(asksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py“,第440行,在init self.__connect(First_connect_check=true)文件”/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py“,第661行,在connect pool.logger.debug(”connect()错误:%s“,e)文件”nnect return self.dbapi.connect(*cargs,**cparams)sqlite3.operationalerror:无法打开数据库文件

上述例外是下列例外的直接原因:

回溯(最近一次调用):文件“”,第1行,在文件“/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/flask_sqlalchemy/init.py”,第1039行,在create_all self._execute_for_all_tables(app,bind,'create_all')文件“/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/flask_sqlalchemy/init.pylf._contextual_connect()作为connn:文件“/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/engine/base.py”,第2305行,in_contextual_connect(self.pool.connect,None);文件“/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/engine/base.py”,第2342行/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py“,第778行,in_checkout fairy=_connectionrecord.checkout(pool)文件”/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py“,第495行,incheckout rec=pool._do_get()文件”Lalchemy/util/langhelpers.py“,第68行,在exit compat.raise中(文件”/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/util/compat.py“,第178行,在raise中引发异常文件”/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/base.py“,第656行,在__connect connection=


共1个答案

匿名用户

参考Miguel的精彩工作https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database。也许您需要让应用程序知道basedir路径?注:他使用app.db而不是site.db。

import os
basedir = os.path.abspath(os.path.dirname(__file__))

class Config(object):
  # ...
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
    'sqlite:///' + os.path.join(basedir, 'app.db')
    SQLALCHEMY_TRACK_MODIFICATIONS = False

然后用

from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)

from app import routes, models

希望这能有一点帮助。