Python使用sqlite3时SELECT带数据库名前缀报无此表的解决方法
报错原因
SQLite是文件型嵌入式数据库,和MySQL这类服务端数据库的schema命名规则完全不同:
- 你通过
sqlite3.connect("xxx")直接连接的单个数据库文件,在当前连接下的固定schema别名为main,不会自动用磁盘上的文件名作为可识别的schema前缀。 - 你的代码里还存在拼写错误:连接时传入的文件名是
my_databse(database漏写了字母a),和你写在查询里的my_database前缀本身就不一致。 - 你没有通过附加数据库的操作给对应数据库文件分配可识别的别名,直接把文件名当schema名写在表名前,SQLite自然找不到对应表。
正确带前缀查询的实现方式
分两种使用场景处理:
- 仅查询当前连接的数据库内的表
不需要额外加自定义的文件名前缀,直接写表名即可;如果要显式加前缀,使用固定的主库别名main即可,示例:import sqlite3 # 注意修正文件名拼写 con = sqlite3.connect("my_database") cur = con.cursor() cur.execute('''CREATE TABLE IF NOT EXISTS my_table (id INTEGER PRIMARY KEY, content TEXT)''') # 直接查表 cur.execute("SELECT * FROM my_table") # 显式带主库前缀的合法写法 cur.execute("SELECT * FROM main.my_table") - 需要跨多个数据库文件联合查询
先用ATTACH DATABASE语句给需要关联的其他数据库文件指定自定义别名,之后才能用别名.表名的格式访问对应库里的表,示例:import sqlite3 con = sqlite3.connect("my_database") cur = con.cursor() # 附加同目录下的另一个数据库文件other.db,给它分配别名other_db cur.execute("ATTACH DATABASE 'other.db' AS other_db") # 现在就可以用前缀查询附加库的表了 cur.execute("SELECT * FROM other_db.other_table") # 也可以做跨库关联查询 cur.execute(''' SELECT a.*, b.* FROM main.my_table a JOIN other_db.other_table b ON a.id = b.rel_id ''')
注意:附加数据库时如果数据库文件不存在,SQLite会自动创建对应名称的空数据库文件。如果不需要保留附加库的连接,可以执行
DETACH DATABASE 别名卸载。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

