You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Polars DataFrame保存至数据库(如MS SQL)?ConnectorX无此选项

将Polars DataFrame保存到MS SQL的方法

当然有可行的方案,以下是两种常用方法:

方法1:Polars原生write_database(依赖SQLAlchemy)

Polars提供了write_database方法,通过SQLAlchemy连接引擎实现数据写入,支持MS SQL等多种数据库。

步骤:

  1. 安装依赖:
pip install polars sqlalchemy pyodbc
  1. 代码示例:
import polars as pl
from sqlalchemy import create_engine

# 构建MS SQL连接字符串(替换为你的服务器/账号信息)
conn_str = "mssql+pyodbc://<用户名>:<密码>@<服务器地址>/<数据库名>?driver=ODBC+Driver+17+for+SQL+Server"
engine = create_engine(conn_str)

# 示例Polars DataFrame
df = pl.DataFrame({
    "id": [1, 2, 3],
    "username": ["alice", "bob", "charlie"],
    "score": [85, 92, 78]
})

# 写入数据库
df.write_database(
    table_name="user_scores",
    connection=engine,
    if_exists="replace"  # 可选值:append(追加)/replace(覆盖)/fail(存在则报错)
)

方法2:pyodbc直接批量插入

如果不想依赖SQLAlchemy,可以用pyodbc直接操作,适合需要更精细控制插入逻辑的场景。

代码示例:

import polars as pl
import pyodbc

# 建立MS SQL连接
conn = pyodbc.connect(
    "DRIVER={ODBC Driver 17 for SQL Server};"
    "SERVER=<服务器地址>;"
    "DATABASE=<数据库名>;"
    "UID=<用户名>;"
    "PWD=<密码>"
)
cursor = conn.cursor()

# 示例DataFrame
df = pl.DataFrame({
    "id": [1, 2, 3],
    "username": ["alice", "bob", "charlie"],
    "score": [85, 92, 78]
})

# 先创建目标表(如果不存在)
cursor.execute("""
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'user_scores')
CREATE TABLE user_scores (
    id INT,
    username VARCHAR(50),
    score INT
)
""")
conn.commit()

# 批量插入数据
insert_sql = "INSERT INTO user_scores (id, username, score) VALUES (?, ?, ?)"
# 将DataFrame转换为元组列表
data_rows = [tuple(row) for row in df.iter_rows()]
cursor.executemany(insert_sql, data_rows)
conn.commit()

# 关闭连接
cursor.close()
conn.close()

注意事项:

  • 确保已安装ODBC Driver 17 for SQL Server
  • 大数据量场景下,write_database的性能更优,因为它会自动分批次处理数据
  • 若表结构已存在,需保证DataFrame的列类型与数据库表字段类型匹配,避免插入失败

内容的提问来源于stack exchange,提问作者Dennis L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:01:04