【问题标题】:Apache Airflow - Connection issue to MS SQL Server using pymssql + SQLAlchemyApache Airflow - 使用 pymssql + SQLAlchemy 与 MS SQL Server 的连接问题
【发布时间】:2019-05-06 02:20:21
【问题描述】:

我在使用 pymssql 连接到 Apache Airflow 1.10.1 中的 Azure MS SQL Server 2014 数据库时遇到问题。 我想使用 Airflow 提供的 MsSqlHook 类,方便在 Airflow UI 中创建我的连接,然后使用 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的源代码中搜索了原因。 我注意到类 DbApiHook 中的方法 get_uri(继承自 MsSqlHook)构建传递给 SqlAlchemy 的连接字符串em> 像这样:

'{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 server,但不要随意设置:

为了解决这个问题,我在一个继承自 MsSqlHook 的新类中重载了 DbApiHook 中的 get_uri 方法,其中我建立了自己的连接字符串,但它根本不干净......

感谢您的帮助

【问题讨论】:

    标签: python sql-server airflow pymssql


    【解决方案1】:

    你是对的。没有简单直接的方法可以让 Airflow 做你想做的事。就我个人而言,我会在你的上下文管理器中构建 sqlalchemy 引擎,比如create_engine(hook.get_uri().replace("://", "+pymssql://"))——然后我会把代码扔到可重用的地方。

    【讨论】:

    • 是的,这样更好。如果有人只有配置的解决方案,我会保持开放。
    【解决方案2】:

    您可以通过将连接作为环境变量传递给 Airflow 来创建连接。见the docs。变量的值是 SqlAlchemy 接受格式的数据库 URL。

    环境变量的名称遵循模式AIRFLOW_CONN_,您将连接 ID 附加到该模式。例如AIRFLOW_CONN_MY_MSSQL,在这种情况下,conn_id 将是'my_mssql'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-23
      • 2018-03-01
      • 2015-08-02
      • 2021-06-12
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 2022-10-25
      相关资源
      最近更新 更多