Issue deploying Python Flask Package, more specifically unable to open database file

47 Views Asked by At

The Error message that shows up is sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file (Background on this error at: https://sqlalche.me/e/14/e3q8) And the Traceback stated the error as fighters = Fighter.query.all() I have tried different methods of `

fighters.query.get(Fighter)

` I just tried

fighters = Fighter.query.order_by('id').all()

And i had gotten the same error which leads me to think its an issue initializing the database or possibly the database path.

I am unsure whether it is creating the database is the issue or querying the results.

My code in the run.py file is as follows-

import os
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)

# DATABASE_URL is by default

app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('DATABASE_URL', 'sqlite:///tmp/test.db')

db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, email):
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.email


class Fighter(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(120), unique=True)


class Vote(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    user = db.relationship('User', backref=db.backref('votes', lazy='dynamic'))
    fighter_id = db.Column(db.Integer, db.ForeignKey('fighter.id'))
    fighter = db.relationship('Fighter', backref=db.backref('votes', lazy='dynamic'))


@app.route('/', methods=['GET', 'POST'])
def homepage():
    fighters = Fighter.query.all()
    return render_template('index.html', fighters=fighters)


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

And my init_db.py file goes as follows-

from run import db, Fighter

# Create all the tables
db.create_all()

# create fighters
conor = Fighter(name='Conor McGregor')
floyd = Fighter(name='Floyd Mayweather')

# add fighters to session
db.session.add(conor)
db.session.add(floyd)

# commit the fighters to database
db.session.commit()

1

There are 1 best solutions below

2
Ajay K On

try this

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///tmp/test.db'

instead of this

app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('DATABASE_URL', 'sqlite:///tmp/test.db')