使用Polars.write_database连接MSSQL报错:Connection无_instantiate_plugins属性
问题:Polars write_database 报错 'Connection' object has no attribute '_instantiate_plugins'
我有如下的连接对象sql_conn:
CNXN_STR = 'DRIVER={ODBC+Driver+17+for+SQL+Server};SERVER=aws-dev...;DATABASE=DB;MARS_Connection=no;Trusted_Connection=yes;UID=user;PWD=pass@1' sql_conn = sqlalchemy_connect(CNXN_STR) def sqlalchemy_connect(connection_string): quoted = urllib.parse.quote_plus(connection_string) engine = sqlalchemy.create_engine(f'mssql+pyodbc:///?odbc_connect={quoted}', fast_executemany=True) conn = engine.connect() return conn
该sql_conn对象在使用Pandas时可以正常工作,只需执行df.to_sql(table_name, sql_conn, if_exists='append')即可上传数据至数据库。
但现在我尝试迁移到Polars,使用polars.DataFrame.write_database()方法:
df.write_database(table_name, sql_conn, if_table_exists='append')
却出现错误:Failed saving to table due to 'Connection' object has no attribute '_instantiate_plugins'
请问有人知道原因吗?请求帮助。
解决方案
- Polars的
write_database方法要求传入SQLAlchemy的Engine对象,而非已打开的Connection对象,这和Pandas的兼容逻辑不同。 - 修改
sqlalchemy_connect函数,直接返回Engine对象:
def sqlalchemy_connect(connection_string): quoted = urllib.parse.quote_plus(connection_string) engine = sqlalchemy.create_engine(f'mssql+pyodbc:///?odbc_connect={quoted}', fast_executemany=True) return engine # 返回engine而非conn
- 调用时传入Engine对象即可:
sql_engine = sqlalchemy_connect(CNXN_STR) df.write_database(table_name, sql_engine, if_table_exists='append')
- 原因:Polars依赖SQLAlchemy Engine管理连接生命周期,会自行处理连接的打开与关闭,不需要传入已建立的Connection;而Pandas的
to_sql同时支持Engine和Connection两种类型,因此之前的代码在Pandas中可以正常运行。
内容的提问来源于stack exchange,提问作者MHA
相关产品推荐
相关产品推荐

