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

使用Dask DataFrame写入本地SQLite数据库并持久化的问题

问题:Dask DataFrame写入本地持久化SQLite数据库失败

问题背景与初始尝试

通过Dask DataFrame处理多张大型数据表后,希望将结果写入本地持久化SQLite数据库,但遇到以下问题:

  • 使用dask.utils.tmpfile创建临时数据库文件时,写入操作能成功完成,但临时文件在上下文结束后会被自动删除,无法持久化保存,且未找到tmpfile支持持久化的参数。

初始测试代码:

import pandas as pd
import dask.dataframe as dd

df = pd.DataFrame([{"i": i, "s": str(i) * 2} for i in range(4)])
ddf = dd.from_pandas(df, npartitions=2)

from dask.utils import tmpfile
from sqlalchemy import create_engine

with tmpfile(
    dir="/outputs/",
    extension="db",
) as f:
    print(f)
    db = f"sqlite:///{f}"
    ddf.to_sql("test_table", db)

    engine = create_engine(db, echo=False)
    result = engine.execute("SELECT * FROM test_table").fetchall()

print(result)

更新:使用常规文件路径的报错

尝试直接指定常规文件路径时,触发SQLAlchemy连接错误:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file
(Background on this error at: https://sqlalche.me/e/14/e3q8)

对应错误代码:

with open(
    "/outputs/hello.db", "wb"
) as f:
    print(f)
    db = f"sqlite:///{f}"
    ddf.to_sql("test_table", db, if_exists="replace")

    engine = create_engine(db, echo=False)
    result = engine.execute("SELECT * FROM test_table").fetchall()

print(result)

解决方案

核心问题分析

  1. SQLAlchemy的SQLite连接字符串需要的是文件路径字符串,而非Python文件对象,之前错误地将open返回的文件对象拼接到连接字符串中,导致路径无效。
  2. 目标目录可能不存在或无读写权限,导致无法创建数据库文件。

修正后的代码

import pandas as pd
import dask.dataframe as dd
import os
from sqlalchemy import create_engine

# 确保目标目录存在,不存在则创建
os.makedirs("/outputs/", exist_ok=True)

# 构造测试数据
df = pd.DataFrame([{"i": i, "s": str(i) * 2} for i in range(4)])
ddf = dd.from_pandas(df, npartitions=2)

# 直接使用文件路径字符串构造SQLite连接
db_path = "/outputs/hello.db"
db_url = f"sqlite:///{db_path}"

# 将Dask DataFrame写入SQLite
ddf.to_sql(
    name="test_table",
    uri=db_url,
    if_exists="replace",
    index=False  # 根据需求决定是否写入索引
)

# 验证数据写入成功
engine = create_engine(db_url, echo=False)
result = engine.execute("SELECT * FROM test_table").fetchall()
print(result)

# 关闭引擎释放资源
engine.dispose()

关键说明

  • 先通过os.makedirs确保目标目录存在,避免因目录不存在导致的文件创建失败。
  • 直接使用文件路径字符串构造SQLAlchemy的连接URL,而非文件对象。
  • 可选指定index=False避免将Dask DataFrame的索引写入数据库表(根据实际需求调整)。
  • 操作完成后调用engine.dispose()释放数据库连接资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:40:31