Заглушение предупреждений SQLAlchemy - PullRequest
2 голосов
/ 11 апреля 2020

Я переключаю унаследованный проект на автоматическое создание миграций alembi c, и в нем есть некоторые индексы, которые sqlalchemy не распознает. Когда я запускаю alembic revision --autogenerate migration_name, создается пустая миграция (поскольку я устранил все другие несоответствия), но я получаю 8 предупреждений, таких как:

/project/.venv/lib/python3.6/site-packages/sqlalchemy/dialects/postgresql/base.py:3328: SAWarning: Skipped unsupported reflection of expression-based index idx_name
  "expression-based index %s" % idx_name

В postgres я ищу определение индекса следующим образом:

mydb=# SELECT tablename, indexdef FROM pg_indexes WHERE schemaname = 'public' AND indexname = 'idx_name';
 tablename |                                   indexdef                                    
-----------+-------------------------------------------------------------------------------
 plan      | CREATE UNIQUE INDEX idx_name ON public.plan USING btree (lower((name)::text))
(1 row)

После прочтения этого поста SO Я попытался добавить индекс после определения модели и к __table_args__.

# add it after model definition
class Plan(db.Model):
    __table_name__ = 'plan'
    # ...

db.Index('this_does_nothing_in_autogenerate', func.lower(Plan.__table__.c.name), unique=True)
# Add it to table_args
class Plan(Base, db.Model):
    __table_name__ = 'plan'
    __table_args__ = (
        db.Index('idx_this_also_does_nothing', text('LOWER(name)')),
    )

Оба эти изменения добавляют Предупреждения (показаны ниже), создайте пустую миграцию и не удаляйте исходное предупреждение. Я понимаю, что sqlalchemy + alembi c не может обработать эти более сложные индексы, но есть ли способ заставить замолчать предупреждения?

# Warning for first method
/home/chriscauley/develop/kennel/.venv/lib/python3.6/site-packages/alembic/util/messaging.py:69: UserWarning: autogenerate skipping functional index this_does_nothing_in_autogenerate; not supported by SQLAlchemy reflection
  warnings.warn(msg)

# warning for second __table_args__ method
/home/chriscauley/develop/kennel/.venv/lib/python3.6/site-packages/alembic/util/messaging.py:69: UserWarning: autogenerate skipping functional index idx_this_also_does_nothing; not supported by SQLAlchemy reflection
  warnings.warn(msg)

1 Ответ

0 голосов
/ 30 апреля 2020

Да, есть несколько способов заставить замолчать предупреждения. Если вы знаете, куда отправляются предупреждения, вы можете создать диспетчер контекста для захвата этой излучающей функции. Как показано в документации std-lib

import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    fxn()

В противном случае метод не рекомендуется заключается в добавлении следующего к вашему основному сценарию:

import warnings

warnings.simplefilter("ignore")

A более подходящий способ игнорирования предупреждений ( указал мне здесь ) - сначала проверить флаг параметров предупреждений, это позволяет вам снова включать предупреждения, выполняя код с флагом -W (например, python -W):

import sys
import warnings

if not sys.warnoptions:
    warnings.simplefilter("ignore")

И, наконец, ответить на ваш вопрос. Метод warnings.filterwarnings имеет параметр module, который позволяет вам указать модуль, для которого вы будете sh подавлять предупреждения. В вашем случае это может быть:

import warnings

warnings.filterwarnings("ignore", category=UserWarning, module="alembic.util.messaging")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...