如何让LangChain SQLDatabaseChain识别内存中SQLite数据库的表?
解决LangChain SQLDatabaseChain识别SQLite内存表的问题
问题根源
SQLite的:memory:数据库是每个连接独立的,你用sqlite3.connect(':memory:')创建的内存库,和SQLDatabase.from_uri("sqlite:///:memory:")创建的是两个完全隔离的内存实例,后者没有你之前填充的my_table;同时你代码里还犯了表名拼写错误(把my_table写成了mytable),这两个原因共同导致了报错。
两种可行解决方案
方案一:复用已有的sqlite3连接
直接把你已经创建并填充数据的sqlite3连接传给SQLDatabase,不需要重新通过URI创建新连接,这样就能共享同一个内存数据库实例:# 你已有的sqlite3连接db(已填充my_table) from langchain_community.utilities import SQLDatabase from langchain.chains import SQLDatabaseChain # 用现有连接初始化SQLDatabase langchain_db = SQLDatabase(db) # 创建SQLDatabaseChain db_chain = SQLDatabaseChain.from_llm(llm, langchain_db)方案二:使用共享内存数据库URI
如果需要通过URI方式连接,改用SQLite的共享内存模式,让同一个进程内的多个连接共享同一个内存数据库:# 第一步创建连接时使用共享内存URI db = sqlite3.connect('file::memory:?cache=shared', uri=True) # 这里执行Pandas填充my_table的操作... # 初始化SQLDatabase时用同一个URI,注意表名拼写正确 langchain_db = SQLDatabase.from_uri( "file::memory:?cache=shared", schema="main", include_tables=["my_table"] ) db_chain = SQLDatabaseChain.from_llm(llm, langchain_db)
关键注意点
- 确保
include_tables里的表名和实际创建的表名完全一致(你之前代码里写的mytable是错误的,应该是my_table)。 - 共享内存模式仅适用于同一进程内的连接,跨进程无法共享。
内容的提问来源于stack exchange,提问作者eigenvector_heckler
相关产品推荐
相关产品推荐

