The problem:
I'm having trouble getting my SQLite database to work on Heroku. When I try to go to the app's URL in my browser, I get an internal server error. heroku logs
shows this:
OperationalError: (sqlite3.OperationalError) no such table: questions [SQL: u'SELECT questions.id AS questions_id, questions.title AS questions_title, questions.content AS questions_content \nFROM questions']
What I've tried:
I can reproduce this error locally by deleting my local database (there's nothing important in it yet):
$ rm data-dev.sqlite
$ heroku local
# Go to localhost:5000 in my browser, 500 Internal server error
OperationalError: (sqlite3.OperationalError) no such table: questions [SQL: u'SELECT questions.id AS questions_id, questions.title AS questions_title, questions.content AS questions_content \nFROM questions']
I can fix it locally by using Flask-Migrate's upgrade
command:
$ python2 manage.py db upgrade
$ heroku local
# Go to localhost:5000, get a working website
However, when I try to fix it on Heroku by doing the same thing, it doesn't work:
$ heroku run ls
# Doesn't show any .sqlite database files
$ heroku run python manage.py db upgrade
# Go to the website URL, get 500 Internal server error
$ heroku logs
OperationalError: (sqlite3.OperationalError) no such table: questions [SQL: u'SELECT questions.id AS questions_id, questions.title AS questions_title, questions.content AS questions_content \nFROM questions']
I've also tried manually dropping and creating the tables:
$ heroku run python manage.py shell
>>> db.drop_all()
>>> db.create_all()
>>> quit()
# Go to website URL, get 500 Internal server error
$ heroku logs
OperationalError: (sqlite3.OperationalError) no such table: questions [SQL: u'SELECT questions.id AS questions_id, questions.title AS questions_title, questions.content AS questions_content \nFROM questions']
I'm pretty stumped at what to do. It looks like Flask-Migrate doesn't create the database file for some reason. I tried open('textfile.txt', 'w')
in manage.py
, and it successfully created the file.