#python-3.x #flask #pytest #flask-sqlalchemy
Вопрос:
В моем коде я добавил светильники, с помощью которых я могу добавлять данные в базу данных, как показано ниже —
@pytest.fixture(scope="function")
def add_post():
def _add_post(text, user_id, parent_id, branch_id):
post = Posts(
postBody={
"text": text,
"parent_id": parent_id,
"branch_id": branch_id,
},
user_id=user_id,
)
db.session.add(post)
db.session.commit()
return post
return _add_post
В моем тестовом примере первый экземпляр печати работает, но второй терпит неудачу —
post1 = add_post("post1", user1.id, None, None)
post2 = add_post("post2", user2.id, post1.id, None)
print(post2.id) #This works
resp = client.post(
"/v1/post/react/",
data=json.dumps(
{
"post_id": post2.id,
"emoji_id": 1
}
),
headers=headers,
)
print(post2.id) #This fails
resp
Ответ приходит нормально, но почему я получаю эту ошибку —
sqlalchemy.orm.exc.DetachedInstanceError: Instance <Posts at 0x7fab1d9eff70> is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: http://sqlalche.me/e/13/bhk3)
Это может происходить, потому что в фоновом python-rq
режиме работает рабочий? и это создает отдельный контекст подключения к БД / приложения? Как настроить такой сценарий? Ниже приведен код для моей рабочей задачи, увеличивающий счетчик реакций.
def increment_reaction_counter(post_id, emoji_id):
temp_app = create_app()
with temp_app.app_context():
reaction_counter = ReactionCounts.get_existing(emoji_id, post_id)
if reaction_counter is None:
reaction_counter = ReactionCounts(emoji_id, post_id)
db.session.add(reaction_counter)
else:
reaction_counter.count = 1
db.session.commit()