如何让SQLite支持db.schema.table格式查询以适配测试代码?
实现SQLite支持
db.schema.table三级命名查询的方案 SQLite原生不支持PostgreSQL/Databricks那样的多层schema结构,它的命名规则仅支持[数据库名.]表名的二级格式。要让select * from db.schema.table这类查询正常执行,且不修改原查询语句,可采用以下两种方案:
方案1:用表名包含点的方式模拟三级结构
无需额外扩展,直接利用SQLite允许表名包含特殊字符(需用双引号定义)的特性,将schema.table作为完整表名创建在db数据库下,让原查询语句匹配到目标表。
修正后的Python代码示例:
import sqlite3 mock_db = sqlite3.connect(":memory:") cursor = mock_db.cursor() # 附加共享内存数据库作为db(避免独立内存实例无法共享数据) cursor.execute("ATTACH DATABASE 'file::memory:?cache=shared' AS db") # 在db数据库中创建表名带点的表 cursor.execute('CREATE TABLE db."schema.table" ("Column1" TEXT, "Column2" INTEGER)') # 插入测试数据 cursor.execute('INSERT INTO db."schema.table" VALUES (?, ?)', ('测试文本', 100)) mock_db.commit() # 执行原查询语句 cursor.execute('select * from db.schema.table') print(cursor.fetchall()) # 输出:[('测试文本', 100)] cursor.close() mock_db.close()
方案2:使用SQLite扩展原生支持Schema
借助sqlean扩展集合中的schema模块,让SQLite支持类似PostgreSQL的schema概念,从而原生适配三级命名查询。
步骤:
- 安装sqlean扩展:
pip install sqlean.py - 加载扩展并创建schema结构
代码示例:
import sqlite3 import sqlean mock_db = sqlite3.connect(":memory:") # 加载schema扩展 sqlean.load(mock_db, "schema") cursor = mock_db.cursor() # 附加共享内存数据库作为db cursor.execute("ATTACH DATABASE 'file::memory:?cache=shared' AS db") # 在db数据库下创建schema cursor.execute("CREATE SCHEMA db.schema") # 在schema中创建目标表 cursor.execute('CREATE TABLE db.schema.table ("Column1" TEXT, "Column2" INTEGER)') # 插入测试数据 cursor.execute('INSERT INTO db.schema.table VALUES (?, ?)', ('扩展测试', 200)) mock_db.commit() # 执行原查询语句 cursor.execute('select * from db.schema.table') print(cursor.fetchall()) # 输出:[('扩展测试', 200)] cursor.close() mock_db.close()
原代码错误修正
你提供的代码存在两处问题:
cursor.create是错误方法,应改为cursor.execute- 直接附加
:memory:会创建独立内存数据库,建议使用file::memory:?cache=shared确保数据共享
内容的提问来源于stack exchange,提问作者ic_fl2
相关产品推荐
相关产品推荐

