от
Я пишу модуль для записи материала в базу данных с использованием SQLAlchemy (SQLAlchemy == 1.3.5) и Python 3.6.8. Я пытаюсь добавить журнал в таблицу. Если таблица не существует, я улавливаю ошибку «Таблица не существует», а затем создаю таблицу (которая работает нормально). Проблема в том, что происходит сбой, когда я пытаюсь добавить тот же элемент в сеанс. Кажется, «коммит» заставляет его просто остановиться. Я пытался использовать исключение 'exc.NoSuchTableError', но, похоже, это не указывало на то, что таблица не существует. Я также пробовал различные комбинации использования просто flush или просто commit, но результаты были такими же, как в выходных данных. У меня есть отдельный файл test.py, содержащий:
#!/usr/bin/env python

import ail

add_to_log = ail.add_to_log(
    tool='ansible',
    component='system management',
    level=6,
    description="This is a test message!",
)
Модуль ail.py:
#!/usr/bin/env python

import sqlalchemy as db
from sqlalchemy import exc
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy_filters import apply_filters

import pprint
import time
import re

def add_to_log(tool, component, description, level=6):
    """

        Add an entry to the 'logs' table.

        E.g: add_to_log = log.add_to_log(
                 tool='cims_import.py',
                 component='database',
                 level=6,
                 description="The CIMS import script was unable to access the CIMS database.",
             )

    :param tool: Tool the log item is for, e.g.: cims, spectrum, capm, nfa, etc.
    :param component: The component the log relates to, e.g.: 'api', 'ssh' or 'backups'
    :param level: 0=Emergency, 1=Alert, 2=Critical, 3=Error, 4=Warning, 5=Notice, 6=Informational, 7=Debug
    :param description: Description of event added to the logs.
    :return: dictionary containing results, e.g.: {'action': 'added'}
             In the event of an error, a dict containing {'error': ''} will be returned.
    """

    try:

        # Try to add log item to the 'logs' table:
        logged_item = Log(
            tool=tool,
            component=component,
            level=level,
            description=description,
        )
        s2s.add(logged_item)
        s2s.commit()
        return {'action': 'added'}

    except exc.SQLAlchemyError as e:

        print("First attempt failed, creating database!")

        # Unable to add the log item:
        if re.search(r"Table '.*' doesn't exist", str(e)):

            print("Table issue")
            # The 'logs' table does not exist 

Я проверяю, что таблица 'logs' не существует в БД, и запускаю ее:

Вход в первый запуск:

(venv) [user@server venv]$ ./test.py 
2019

Так почему же он не фиксирует и даже не помещает дополнительные сообщения об ошибках после «фиксации»?

Таким образом, на этом этапе сама таблица была создана, но нет записи в журнале.

Если я запускаю его снова (с созданной таблицей) любое количество раз, когда он работает нормально:

(venv) [user@server venv]$ test.py
2019

Это почти как если бы создание таблицы помешало сеансу (s2s).

Может ли кто-нибудь предложить какой-либо совет / помощь относительно того, почему это происходит?
    

        

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.
...