如何在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
相关产品推荐
相关产品推荐

