Apache Airflow - проблема подключения к MS SQL Server с использованием pymssql + SQLAlchemy - PullRequest
0 голосов
/ 04 декабря 2018

У меня проблема с подключением к Azure MS SQL Server 2014 в Apache Airflow 1.10.1 с использованием pymssql .Я хочу использовать класс MsSqlHook , предоставляемый Airflow, для удобства создания моего соединения в пользовательском интерфейсе Airflow, а затем создать диспетчер контекста для моего соединения, используя SqlAlchemy :

@contextmanager
def mssql_session(dt_conn_id):
    sqla_engine = MsSqlHook(mssql_conn_id=dt_conn_id).get_sqlalchemy_engine()
    session = sessionmaker(bind=sqla_engine)()
    try:
        yield session
    except:
        session.rollback()
        raise
    else:
        session.commit()
    finally:
        session.close()

Но когда я делаю это, у меня появляется эта ошибка при запуске запроса:

sqlalchemy.exc.InterfaceError: (pyodbc.InterfaceError) ('IM002', '[IM002] [unixODBC] [Диспетчер драйверов] Не найдено имя источника данных, и не указан драйвер по умолчанию (0) (SQLDriverConnect) ') (Справочная информация об этой ошибке: http://sqlalche.me/e/rvf5)

Похоже, из pyodbc , тогда как я хочу использовать pymssql (а в MsSqlHook , метод get_conn использует pymssql !)

Я искал в исходном коде Airflow причину. Я заметил, что метод get_uri из класса DbApiHook (от которого наследуется MsSqlHook ) строит строку подключения, переданную SqlAlchemy следующим образом:

'{conn.conn_type}: // {login} {host} / {conn.schema}'

Но conn.conn_type просто равно' mssql ' тогда как нам нужно указать DBAPI, как описано здесь: https://docs.sqlalchemy.org/en/latest/core/engines.html#microsoft-sql-server (например: ' mssql + pymssql: // scott: tiger @ hostname: port / dbname ')

Итак, по умолчанию я думаю, что он использует pyodbc .Но как правильно установить conn_type соединения для ' mssql + pymssql ' вместо ' mssql '?В Airflow IU вы можете просто выбрать SQL-сервер в раскрывающемся списке, но не установить его так, как вам нужно:

Airflow UI choose connection type

Чтобы обойти проблему,Я перегружаю метод get_uri из DbApiHook в новом классе, который я создал, унаследованном от MsSqlHook , и в котором я строю свою собственную строку подключения, но она не чистая ввсе ...

Спасибо за любую помощь

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вы можете создать соединение, передав его в качестве переменной среды в Airflow.См. документы .Значением переменной является URL базы данных в формате, который принимает SqlAlchemy.

Имя env var следует шаблону AIRFLOW_CONN_, к которому вы добавляете идентификатор соединения.Например, AIRFLOW_CONN_MY_MSSQL, в этом случае conn_id будет 'my_mssql'.

0 голосов
/ 05 декабря 2018

Ты прав.Нет простого и простого способа заставить Airflow делать то, что вы хотите.Лично я бы собрал движок sqlalchemy внутри вашего менеджера контекста, что-то вроде create_engine(hook.get_uri().replace("://", "+pymssql://")) - тогда я бы бросил код куда-нибудь для повторного использования.

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