У меня проблема с подключением к 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](https://i.stack.imgur.com/E85D2.png)
Чтобы обойти проблему,Я перегружаю метод get_uri из DbApiHook в новом классе, который я создал, унаследованном от MsSqlHook , и в котором я строю свою собственную строку подключения, но она не чистая ввсе ...
Спасибо за любую помощь