在
polars>=0.16.10
之前,我使用 .to_pandas().to_sql()
将极坐标数据帧发送到数据库。
现在应该可以使用包装器pl.Dataframe.write_database()
,但是,尽管我的
connection_uri
适用于 pl.read_database()
和 pl.read_sql()
。这对pl.Dataframe.write_database()
不起作用。
这有效:
connection_uri = "mssql+pyodbc://username:password@server:port/database"
pl.read_database(query, connection_uri)
# or
pl.read_sql(query, connection_uri)
这不是:
df = pl.Dataframe({...})
df.write_database(
table_name='dbo.Mytable',
connection_uri="mssql+pyodbc://username:password@server:port/database",
if_exists="append",
engine="sqlalchemy"
)
»»» sqlalchemy.exc.InterfaceError: (pyodbc.InterfaceError) ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')
到目前为止我一直使用旧方法
.to_pandas().to_sql()
,现在在最新的pandas更新后添加了.to_pandas(use_pyarrow_extension_array=True).to_sql()
。
但我发现很奇怪的是,相同的connection_uri字符串适用于read_database,但不适用于write_database。
当您使用
to_pandas().to_sql()
时,您将哪些参数放入 to_sql()
中?
从 docs 来看,您似乎必须为其提供
sqlalchemy
引擎。下一个问题,你如何启动引擎?是使用相同的连接字符串还是不同的语法?
pl.DataFrame.write_database
方法的源代码(无论如何相关部分)是这样的:
try:
from sqlalchemy import create_engine
except ImportError as exc:
raise ImportError(
"'sqlalchemy' not found. Install polars with 'pip install polars[sqlalchemy]'."
) from exc
engine = create_engine(connection_uri)
# this conversion to pandas as zero-copy
# so we can utilize their sql utils for free
self.to_pandas(use_pyarrow_extension_array=True).to_sql(
name=table_name, con=engine, if_exists=if_exists, index=False
)
因此,无论您使用什么连接字符串来创建用于 pandas
sqlalchemy
的 to_sql
引擎,都必须适用于极地 write_database
,因为它所做的只是使用 pandas
to_sql
。
我在用 Polars write_database 到 sqlite3 时遇到同样的问题。 人们需要极坐标“write_database”的模型代码。