繁体   English   中英

Apache Airflow-使用pymssql + SQLAlchemy的MS SQL Server连接问题

[英]Apache Airflow - Connection issue to MS SQL Server using pymssql + SQLAlchemy

我在使用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 (从其继承了MsSqlHook )中的方法get_uri构建了传递给SqlAlchemy的连接字符串,如下所示:

'{} conn.conn_type:// {登录} {主机} / {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,而不必根据需要进行设置:

气流UI选择连接类型

要解决这个问题,我从过载的DbApiHook方法get_uri在我创建从MsSqlHook继承的,我在其中建立自己的连接字符串一个新的类,但它不干净在所有...

谢谢你的帮助

你是对的。 没有简单,直接的方法让Airflow来完成您想要的事情。 我个人将在您的上下文管理器中构建sqlalchemy引擎,类似于create_engine(hook.get_uri().replace("://", "+pymssql://")) -然后将代码create_engine(hook.get_uri().replace("://", "+pymssql://"))可重用的地方。

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

env var的名称遵循将连接ID​​附加到模式AIRFLOW_CONN_的形式。 例如AIRFLOW_CONN_MY_MSSQL ,在这种情况下, conn_id'my_mssql'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM