SQLAlchemy выполняет операторы в неправильном порядке, приводя к выполнению Class.query.get (0) перед create_all () - PullRequest
0 голосов
/ 24 апреля 2020

Когда я развернул свое приложение flask в Heroku, у меня возникли проблемы с удалением таблиц, их созданием и последующей загрузкой тестовых данных в базу данных.

Соответствующий код из инициализация базы данных:

db.drop_all()
db.session.commit()
db.create_all()
db.session.commit()


from setup import setup, test

setup()
if os.getenv('TESTING'):
    test()
db.session.commit()

Этот код предназначен для удаления таблиц из базы данных, а затем воссоздания базы данных с пустыми таблицами. После этого следует зафиксировать изменения в базе данных, другими словами, таблицы должны быть созданы.

Однако

Inside setup () (где происходит сбой)

def setup():
    if not Administrator.query.first():
        administrator = Administrator(username=os.getenv('ADMINISTRATOR_USERNAME'), hash=generate_password_hash(os.getenv('ADMINISTRATOR_PASSWORD')))
        db.session.add(administrator)

Когда программа достигает этой точки, происходит сбой, поскольку таблица администратора еще не создана, это подтверждается при выводе информации об отладке sqlalchemy.

2020-04-24T08:19:58.396545+00:00 app[web.1]: INFO:sqlalchemy.engine.base.Engine:SELECT administrator.id AS administrator_id, administrator.username AS administrator_username, administrator.hash AS administrator_hash   2020-04-24T08:19:58.330096+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/pymysql/err.py", line 109, in raise_mysql_exception
2020-04-24T08:19:58.330096+00:00 app[web.1]: raise errorclass(errno, errval)
2020-04-24T08:19:58.330096+00:00 app[web.1]: pymysql.err.ProgrammingError: (1146, "Table 'heroku_d521d660a24caa2.administrator' doesn't exist")

...

2020-04-24T08:19:58.330103+00:00 app[web.1]: File "/app/app.py", line 56, in <module>
2020-04-24T08:19:58.330103+00:00 app[web.1]: setup()
2020-04-24T08:19:58.330103+00:00 app[web.1]: File "/app/setup.py", line 10, in setup
2020-04-24T08:19:58.330103+00:00 app[web.1]: if not Administrator.query.first():

...

sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1146, "Table 'heroku_d521d660a24caa2.administrator' doesn't exist")
2020-04-24T08:19:58.330118+00:00 app[web.1]: [SQL: SELECT administrator.id AS administrator_id, administrator.username AS administrator_username, administrator.hash AS administrator_hash
2020-04-24T08:19:58.330118+00:00 app[web.1]: FROM administrator
2020-04-24T08:19:58.330118+00:00 app[web.1]: LIMIT %(param_1)s]
2020-04-24T08:19:58.330119+00:00 app[web.1]: [parameters: {'param_1': 1}]
2020-04-24T08:19:58.330119+00:00 app[web.1]: (Background on this error at: http://sqlalche.me/e/f405)
2020-04-24T08:19:58.330413+00:00 app[web.1]: [2020-04-24 08:19:58 +0000] [11] [INFO] Worker exiting (pid: 11)
2020-04-24T08:19:58.330416+00:00 app[web.1]: INFO:sqlalchemy.engine.base.Engine:ROLLBACK
2020-04-24T08:19:58.332568+00:00 app[web.1]: INFO:sqlalchemy.engine.base.Engine:DESCRIBE `mentor_notification`
2020-04-24T08:19:58.332685+00:00 app[web.1]: INFO:sqlalchemy.engine.base.Engine:{}
2020-04-24T08:19:58.334972+00:00 app[web.1]: INFO:sqlalchemy.engine.base.Engine:ROLLBACK
2020-04-24T08:19:58.337722+00:00 app[web.1]: INFO:sqlalchemy.engine.base.Engine:
2020-04-24T08:19:58.337722+00:00 app[web.1]: CREATE TABLE administrator (
2020-04-24T08:19:58.337723+00:00 app[web.1]: id INTEGER NOT NULL AUTO_INCREMENT,
2020-04-24T08:19:58.337723+00:00 app[web.1]: username VARCHAR(80) NOT NULL,
2020-04-24T08:19:58.337724+00:00 app[web.1]: hash TEXT NOT NULL,
2020-04-24T08:19:58.337724+00:00 app[web.1]: PRIMARY KEY (id),
2020-04-24T08:19:58.337724+00:00 app[web.1]: UNIQUE (username)
2020-04-24T08:19:58.337725+00:00 app[web.1]: )
2020-04-24T08:19:58.337725+00:00 app[web.1]: 
2020-04-24T08:19:58.337725+00:00 app[web.1]: 
2020-04-24T08:19:58.337803+00:00 app[web.1]: INFO:sqlalchemy.engine.base.Engine:{}
2020-04-24T08:19:58.341295+00:00 app[web.1]: INFO:sqlalchemy.engine.base.Engine:COMMIT
2020-04-24T08:19:58.344883+00:00 app[web.1]: INFO:sqlalchemy.engine.base.Engine:
2020-04-24T08:19:58.344884+00:00 app[web.1]: CREATE TABLE mentor (
2020-04-24T08:19:58.344885+00:00 app[web.1]: id INTEGER NOT NULL AUTO_INCREMENT,
2020-04-24T08:19:58.344885+00:00 app[web.1]: mentor_name TEXT NOT NULL,
2020-04-24T08:19:58.344886+00:00 app[web.1]: category TEXT NOT NULL,
2020-04-24T08:19:58.344886+00:00 app[web.1]: description TEXT NOT NULL,
2020-04-24T08:19:58.344886+00:00 app[web.1]: special_instructions TEXT NOT NULL,
2020-04-24T08:19:58.344887+00:00 app[web.1]: contact_name TEXT NOT NULL,
2020-04-24T08:19:58.344887+00:00 app[web.1]: phone TEXT NOT NULL,

Так очень четко или, по крайней мере, согласно в порядке информации, которую распечатывает SQLAlchemy, происходит что-то странное, когда команда create_all () не создает таблицы до того, как информация была или, по крайней мере, была предпринята попытка выбора. Я добавил коммиты после строк модификаций таблицы в попытках «расставить приоритеты» этих изменений в базе данных безрезультатно.

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