使用pymssql+SQLAlchemy到MS-SQL服务器的Apache气流连接问题

2024-05-23 22:53:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用pymssql连接到Apache flow 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][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)') (Background on this error at: http://sqlalche.me/e/rvf5)

它似乎来自于pyodbc,而我想使用pymssql(在MsSqlHook中,方法get-conn使用pymssql)在

我在源代码中搜索气流的原因。 我注意到来自类DbApiHook的方法get\u uri(继承自MsSqlHook)构建传递给SqlAlchemy的连接字符串,如下所示:

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

但是连接类型简单地等于'mssql',而我们需要指定DBAPI,如下所述: https://docs.sqlalchemy.org/en/latest/core/engines.html#microsoft-sql-server (例如:'mssql+pymssql://scott:tiger@hostname:端口/dbname')

所以,默认情况下,我认为它使用pyodbc。 但如何正确设置连接到'mssql+pymssql'的连接类型而不是'mssql? 在Airflow IU中,您只需在下拉列表中选择SQL server,而不必根据需要进行设置:

Airflow UI choose connection type

为了解决这个问题,我在一个继承了MsSqlHook的新类中重载了get-uri方法,在这个类中我构建了自己的连接字符串,但它一点也不干净。。。在

谢谢你的帮助


Tags: 方法idsqlgetsqlalchemysessiondtconn
2条回答

你说得对。没有简单、直接的方法可以让气流达到你想要的效果。就我个人而言,我会在你的上下文管理器中构建sqlalchemy引擎,类似于create_engine(hook.get_uri().replace("://", "+pymssql://")),然后我会把代码扔到可重用的地方。在

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

env var的名称遵循模式AIRFLOW_CONN_,在这个模式中,AIRFLOW_CONN_MY_MSSQL,在本例中,conn_id将是{}。在

相关问题 更多 >