如何从独立脚本读取Python创建的内存SQLite数据库数据至DataFrame
问题结论
你当前使用默认参数创建的内存SQLite数据库,无法直接从另一个独立脚本中读取数据。原因是sqlite://对应的是进程私有临时内存空间,原脚本进程退出后数据会直接被释放,且其他独立脚本(归属于不同进程)默认没有权限访问该专属内存区域。
如果要实现跨脚本读取数据库数据,可选以下两种成熟方案:
方案1:改用持久化磁盘SQLite数据库(最推荐,稳定性最高)
该方案改造成本极低,仅需修改数据库连接地址为磁盘路径,两个脚本访问同一个数据库文件即可实现数据互通,进程退出后数据也不会丢失。
原写入脚本修改点
仅需调整引擎创建代码,其余写入逻辑无需改动:
import pandas as pd from sqlalchemy import create_engine # 数据会持久化保存在当前目录下的my_db.db文件中 engine = create_engine('sqlite:///my_db.db', echo=False) # 以下原有写入逻辑保持不变 df = pd.DataFrame({'name' : ['User 1', 'User 2', 'User 3']}) df.to_sql('users', con=engine) with engine.begin() as connection: df1 = pd.DataFrame({'name' : ['User 4', 'User 5']}) df1.to_sql('users', con=connection, if_exists='append') df2 = pd.DataFrame({'name' : ['User 6', 'User 7']}) df2.to_sql('users', con=engine, if_exists='append') print('数据写入完成')
独立读取脚本实现
直接连接同一个磁盘数据库文件,用pandas内置方法读取表数据即可:
import pandas as pd from sqlalchemy import create_engine # 连接同一个磁盘数据库文件 engine = create_engine('sqlite:///my_db.db', echo=False) # 读取users表数据到新的DataFrame new_df = pd.read_sql("SELECT * FROM users", con=engine) print(new_df)
方案2:使用共享内存SQLite(仅适合临时内存运行场景)
如果你确实要求数据全程不落地磁盘,可以开启SQLite的共享内存模式,注意该方案要求原写入脚本必须持续运行不能退出,一旦原脚本进程终止,数据会全部丢失。
原写入脚本修改点
调整引擎创建参数开启共享内存:
# 开启共享内存模式,同主机其他进程可通过相同URI访问该内存库 engine = create_engine('sqlite:///file::memory:?cache=shared', echo=False, connect_args={'uri': True}) # 其余写入逻辑保持不变
独立读取脚本实现
使用相同的共享内存URI连接即可读取数据:
import pandas as pd from sqlalchemy import create_engine # 用相同URI连接共享内存库,必须添加uri=True参数 engine = create_engine('sqlite:///file::memory:?cache=shared', echo=False, connect_args={'uri': True}) new_df = pd.read_sql("SELECT * FROM users", con=engine) print(new_df)
注意:共享内存模式稳定性远低于磁盘持久化方案,仅适合临时数据交换场景使用。
内容的提问来源于stack exchange,提问作者Darren Lefcoe
相关产品推荐
相关产品推荐

