我在使用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,而不必根据需要进行设置:
为了解决这个问题,我在一个继承了MsSqlHook的新类中重载了get-uri方法,在这个类中我构建了自己的连接字符串,但它一点也不干净。。。在
谢谢你的帮助
你说得对。没有简单、直接的方法可以让气流达到你想要的效果。就我个人而言,我会在你的上下文管理器中构建sqlalchemy引擎,类似于
create_engine(hook.get_uri().replace("://", "+pymssql://"))
,然后我会把代码扔到可重用的地方。在可以通过将其作为环境变量传递给Airflow来创建连接。见the docs。变量的值是SqlAlchemy接受的格式的数据库URL。在
env var的名称遵循模式}。在
AIRFLOW_CONN_
,在这个模式中,AIRFLOW_CONN_MY_MSSQL
,在本例中,conn_id
将是{相关问题 更多 >
编程相关推荐