我无法按照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=
参考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
希望这能有一点帮助。