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

如何让ADBC SQLite连接共享并访问SQLite3内存数据库中的表?

如何让ADBC SQLite连接共享并访问SQLite3内存数据库中的表?

看起来你遇到的问题核心是共享内存连接的配置细节、事务可见性,再加上代码里的几个小语法错误,导致ADBC连接看不到sqlite3创建的表。我来一步步帮你排查解决:

先修正代码里的基础语法错误

你的测试代码里有两处明显的低级问题,先改掉它们:

  1. 重复的import:import import adbc_driver_sqlite.dbapi 应该改成 import adbc_driver_sqlite.dbapi as arrowdb
  2. 变量名错误:data.arrow_cursor.execute(...) 应该是 arrow_cursor.execute(...),你并没有定义data这个变量

核心问题:共享内存的一致性与事务可见性

SQLite的共享内存跨连接访问需要两个关键前提,之前的尝试大概率是没满足这些要求:

1. 用完全一致的共享内存URI

file::memory:?cache=shared 虽然是标准写法,但不同驱动对参数解析可能有细微差异。建议用带具体标识的URI,比如file:shared_mem_db?mode=memory&cache=shared&uri=true,这样两个连接的共享标识更明确,不会出现匹配不上的情况。

2. 确保sqlite3的表操作提交事务

默认情况下,sqlite3会把DDL(比如CREATE TABLE)放在隐式事务里,如果不手动提交,其他共享连接完全看不到这个表的存在。所以创建表或插入数据后,一定要调用memory_conn.commit()。

3. 正确获取ADBC查询的结果

ADBC的cursor执行查询后不会直接返回数据,你需要用fetch_arrow_table()(或fetchall())来获取实际结果,直接打印cursor是看不到表信息的。

修正后的完整可运行代码

import adbc_driver_sqlite.dbapi as arrowdb
import sqlite3

# 定义统一的共享内存URI,两个连接必须完全一致
shared_mem_uri = "file:shared_mem_db?mode=memory&cache=shared&uri=true"

# 1. 先通过sqlite3连接创建表并提交事务
memory_conn = sqlite3.connect(shared_mem_uri, uri=True)
memory_cursor = memory_conn.cursor()

# 创建测试表并插入数据
memory_cursor.execute("CREATE TABLE example_table (id INTEGER PRIMARY KEY, name TEXT)")
memory_cursor.execute("INSERT INTO example_table VALUES (1, 'test_1'), (2, 'test_2')")
# 必须提交事务,否则ADBC连接看不到表
memory_conn.commit()

# 2. 用同一个URI创建ADBC连接
arrow_conn = arrowdb.connect(shared_mem_uri)
arrow_cursor = arrow_conn.cursor()

# 3. 测试查看所有表
tables_result = arrow_cursor.execute("SELECT name FROM sqlite_master WHERE type = 'table'").fetch_arrow_table()
print("ADBC连接可见的表:")
print(tables_result.to_pandas())  # 转成DataFrame方便查看

# 4. 测试查询example_table
data_result = arrow_cursor.execute("SELECT * FROM example_table").fetch_arrow_table()
print("\nexample_table中的数据:")
print(data_result.to_pandas())

额外注意事项

  • 确保ADBC SQLite驱动是最新版本:旧版本可能对共享内存URI的支持不完善,可通过pip install --upgrade adbc-driver-sqlite升级。
  • 不要随意修改URI参数的顺序或拼写,两个连接的URI必须完全一致,包括所有参数。
  • 如果你的实际代码涉及复杂的表操作,所有DDL/DML操作都要记得提交事务,否则跨连接的可见性会出问题。

备注:内容来源于stack exchange,提问作者Desmond Spicer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 20:09:31