首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Apache Airflow -使用pymssql + SQLAlchemy连接到MS SQL Server的问题

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

Stack Overflow用户
提问于 2018-12-04 23:46:50
回答 2查看 3K关注 0票数 4

我在Apache Airflow 1.10.1中使用pymssql连接到Azure MS SQL Server2014数据库时遇到了一个问题。为了方便起见,我想使用Airflow提供的MsSqlHook类在Airflow UI中创建连接,然后使用SqlAlchemy为连接创建上下文管理器

代码语言:javascript
复制
@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','IM002Driver ManagerData源名称未找到,未指定默认驱动程序(0) (SQLDriverConnect)') (此错误的背景信息位于:http://sqlalche.me/e/rvf5)

它似乎来自get_conn,而我想使用pymssql (在pyodbc中,pyodbc方法使用pymssql !)

我在Airflow的源代码中搜索了原因。我注意到来自类DbApiHook (继承了MsSqlHook)的get_uri方法构建了传递给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

所以,默认情况下,我认为它使用pyodbc。但是,我如何正确地将连接的conn_type设置为'mssql+pymssql‘而不是'mssql’?在Airflow IU中,您可以简单地在下拉列表中选择SQL server,但不能根据需要进行设置:

为了解决这个问题,我在我创建的继承自MsSqlHook的新类中重载了来自DbApiHook的get_uri方法,并在其中构建了自己的连接字符串,但它一点也不干净……

谢谢你的帮助

EN

回答 2

Stack Overflow用户

发布于 2018-12-05 10:59:44

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

票数 2
EN

Stack Overflow用户

发布于 2019-02-21 03:52:29

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

环境变量的名称遵循附加连接ID的模式AIRFLOW_CONN_。例如AIRFLOW_CONN_MY_MSSQL,在本例中,conn_id将是'my_mssql'

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53616630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档