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

如何在Python中无需临时文件用duckdb.read_json_auto插入字典到DuckDB?

无需临时文件用duckdb.read_json_auto插入字典到指定表的方案

直接将Python字典转为JSON字符串,结合DuckDB的参数化查询即可实现,无需创建临时文件。修改后的代码如下:

import duckdb
import json

def save_to_duckdb(data):
    # 连接DuckDB数据库
    conn = duckdb.connect('nodes_log_duck.db')
    table_name = data.get('name')
    if not table_name:
        conn.close()
        return
    
    # 将字典转为JSON字符串
    json_str = json.dumps(data)
    
    try:
        # 检查表是否已存在
        table_exists = conn.execute(
            "SELECT EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = ?)",
            [table_name]
        ).fetchone()[0]
        
        if not table_exists:
            # 不存在则创建表并插入第一条数据
            conn.execute(f"CREATE TABLE {table_name} AS SELECT * FROM read_json_auto(?)", [json_str])
        else:
            # 表已存在,直接插入新数据
            conn.execute(f"INSERT INTO {table_name} SELECT * FROM read_json_auto(?)", [json_str])
        
        conn.commit()
    finally:
        # 确保连接关闭
        conn.close()

核心优化点

  • 取消临时文件:用json.dumps()直接将字典转为JSON字符串,作为read_json_auto的输入,省去磁盘IO操作
  • 参数化查询:用?占位符传递JSON字符串,既避免手动转义引号的麻烦,又防范SQL注入风险
  • 高效判断表存在:通过information_schema.tables查询表是否存在,逻辑更清晰,避免重复执行创建语句
  • 安全关闭连接:try...finally确保无论执行是否出错,数据库连接都会被正确关闭

注意事项

  • 如果字典包含嵌套结构(如子字典、列表),DuckDB会自动推断对应的STRUCT、LIST类型列
  • 若表名包含特殊字符(如空格、连字符),需要用双引号包裹表名,例如f'CREATE TABLE "{table_name}" AS ...'

内容的提问来源于stack exchange,提问作者Geo-7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:32:46