sqlite3.OperationalError) нет такой таблицы на Heroku - PullRequest
0 голосов
/ 16 мая 2019

Я работаю с https://github.com/hack4impact/flask-base (шаблон колбы) в качестве основы для проекта. Проект выполняется, как и ожидалось, локально в Windows.

Мне не нужно вносить какие-либо изменения в БД в производственную версию моего кода, поэтому для простоты я решил использовать sqllite как локально, так и на heroku. Имея это в виду, я изменил производственный класс в https://github.com/hack4impact/flask-base/blob/master/config.py на:

class ProductionConfig(Config):
    # SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///' + os.path.join(basedir, 'data.sqlite')
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')
    print('IN PRODUCTION '+ SQLALCHEMY_DATABASE_URI)
    SSL_DISABLE = (os.environ.get('SSL_DISABLE') or 'True') == 'True'

При развертывании кода и попытке входа в систему я вижу ошибку 500. Логи показывают:

2019-05-15T21:47:28.749283+00:00 app[web.1]:     raise value.with_traceback(tb)
2019-05-15T21:47:28.749284+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1182, in _execute_context
2019-05-15T21:47:28.749286+00:00 app[web.1]:     context)
2019-05-15T21:47:28.749287+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 470, in do_execute
2019-05-15T21:47:28.749289+00:00 app[web.1]:     cursor.execute(statement, parameters)
2019-05-15T21:47:28.749301+00:00 app[web.1]: sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: users [SQL: 'SELECT users.id AS users_id, users.confirmed AS users_confirmed, users.first_name AS users_first_name, users.last_name AS users_last_name, users.email AS users_email, users.password_hash AS users_password_hash, users.role_id AS users_role_id \nFROM users \nWHERE users.email = ?\n LIMIT ? OFFSET ?'] [parameters: ('me@test.com', 1, 0)]
Disconnected from log stream. There may be events happening that you do not see here! Attempting to reconnect...
2019-05-15T21:47:28.749277+00:00 app[web.1]:     exc_info
2019-05-15T21:47:28.749278+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 203, in raise_from_cause
2019-05-15T21:47:28.749280+00:00 app[web.1]:     reraise(type(exception), exception, tb=exc_tb, cause=cause)
2019-05-15T21:47:28.749281+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 186, in reraise
2019-05-15T21:47:28.749283+00:00 app[web.1]:     raise value.with_traceback(tb)
2019-05-15T21:47:28.749284+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1182, in _execute_context
2019-05-15T21:47:28.749286+00:00 app[web.1]:     context)
2019-05-15T21:47:28.749287+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 470, in do_execute
2019-05-15T21:47:28.749289+00:00 app[web.1]:     cursor.execute(statement, parameters)
2019-05-15T21:47:28.749301+00:00 app[web.1]: sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: users [SQL: 'SELECT users.id AS users_id, users.confirmed AS users_confirmed, users.first_name AS users_first_name, users.last_name AS users_last_name, users.email AS users_email, users.password_hash AS users_password_hash, users.role_id AS users_role_id \nFROM users \nWHERE users.email = ?\n LIMIT ? OFFSET ?'] [parameters: ('me@test.com', 1, 0)]

Похоже, sqlalchemy не может найти стол. Мне интересно, если строка:

SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')

- это неправильный способ доступа к базе данных flatfile (data-dev.sqlite)

1 Ответ

2 голосов
/ 16 мая 2019

Вы действительно не должны использовать SQLite на Heroku . Его файловая система эфемерна . Любые изменения, внесенные в файлы, будут потеряны при следующем перезапуске dyno. Это происходит часто (хотя бы раз в день).

Оригинальный код правильно сделал:

SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///' + os.path.join(basedir, 'data.sqlite')

Если установлена ​​переменная окружения DATABASE_URL, она будет использоваться для подключения к вашей базе данных. Поскольку psycopg2 находится в вашем requirements.txt файле Heroku должен автоматически подготовить базу данных PostgreSQL и установить переменную DATABASE_URL в строку подключения.

Если вам действительно нужно использовать SQLite (а я настоятельно советую против этого), относитесь к нему только для чтения. Вам нужно будет зафиксировать файл базы данных на вашем локальном компьютере для разработки и передать этот коммит в Heroku. Даже тогда это может не работать должным образом. Известно, что Heroku генерирует ошибки, если пользователи Ruby даже пытаются установить sqlite3 gem .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...