2

I am stuck at trying to create a db following a flask tutorial: https://www.youtube.com/watch?v=cYWiDiIUxQc&list=PL-osiE80TeTs4UjLw5MM6OjgkjFeUxCYH&index=4

I've unsuccessfully search for the solution to this issue. Please help.

When I try to run db.create_all() after importing db from my project, I get

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file

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

Error:

db.create_all() Traceback (most recent call last): File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2339, in _wrap_pool_connect return fn() File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 364, in connect return _ConnectionFairy._checkout(self) File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 778, in _checkout fairy = _ConnectionRecord.checkout(pool) File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 495, in checkout rec = pool._do_get() File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/impl.py", line 239, in _do_get return self._create_connection() File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 309, in _create_connection return _ConnectionRecord(self) File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 440, in init self.__connect(first_connect_check=True) File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 661, in connect pool.logger.debug("Error on connect(): %s", e) File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/util/langhelpers.py", line 68, in exit compat.raise( File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 178, in raise raise exception File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 656, in __connect connection = pool._invoke_creator(self) File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/engine/strategies.py", line 114, in connect return dialect.connect(*cargs, **cparams) File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 493, in connect return self.dbapi.connect(*cargs, **cparams) sqlite3.OperationalError: unable to open database file

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "", line 1, in File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/flask_sqlalchemy/init.py", line 1039, in create_all self._execute_for_all_tables(app, bind, 'create_all') File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/flask_sqlalchemy/init.py", line 1031, in _execute_for_all_tables op(bind=self.get_engine(app, bind), **extra) File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/sql/schema.py", line 4546, in create_all bind._run_visitor( File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2097, in _run_visitor with self._optional_conn_ctx_manager(connection) as conn: File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/contextlib.py", line 113, in enter return next(self.gen) File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2089, in _optional_conn_ctx_manager with self._contextual_connect() as conn: File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2305, in _contextual_connect self._wrap_pool_connect(self.pool.connect, None), File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2342, in _wrap_pool_connect Connection.handle_dbapi_exception_noconnection( File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1584, in handle_dbapi_exception_noconnection util.raise( File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 178, in raise raise exception File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 2339, in _wrap_pool_connect return fn() File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 364, in connect return _ConnectionFairy._checkout(self) File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 778, in _checkout fairy = _ConnectionRecord.checkout(pool) File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 495, in checkout rec = pool._do_get() File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/impl.py", line 239, in _do_get return self._create_connection() File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 309, in _create_connection return _ConnectionRecord(self) File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 440, in init self.__connect(first_connect_check=True) File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 661, in connect pool.logger.debug("Error on connect(): %s", e) File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/util/langhelpers.py", line 68, in exit compat.raise( File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 178, in raise raise exception File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 656, in __connect connection = pool._invoke_creator(self) File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/engine/strategies.py", line 114, in connect return dialect.connect(*cargs, **cparams) File "/home/kbyrd/anaconda3/envs/flasksite/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 493, in connect return self.dbapi.connect(*cargs, **cparams) sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file (Background on this error at: http://sqlalche.me/e/13/e3q8)

abestrad
  • 898
  • 2
  • 12
  • 23
kbizzle
  • 21
  • 1
  • 2

3 Answers3

1

Referencing the brilliant work of Miguel https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database. Perhaps you need to let the application know the basedir path? Note he uses app.db not site.db Eg.

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

And then he initialises the db with

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

Hope this helps a little.

Isd Sava
  • 196
  • 1
  • 7
1
# I found this helpful    
>>> from project import app, db
>>> app.app_context().push()
>>> db.create_all()
#Flask-SQLAlchemy db.create_all() raises RuntimeError working outside of application context I hope you found a solution that worked for you
0

I figured out what the problem is. My programs is saved in a share using SMB. When I saved to the tmp directory, I was able to create the db. I haven't figured out how to create the db on the share yet, but my goal was accomplished anyway by just creating the db and committing records to it.

kbizzle
  • 21
  • 1
  • 2