【发布时间】: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