SQLite3报Unable to resolve table错误,重建表后仍无法正常运行
问题根因
- 路径匹配错误:代码中
sqlite3.connect('database.db')使用的相对路径是相对于脚本运行时的工作目录,而非脚本文件自身的存储目录。你将数据库文件迁移到db子文件夹后,代码运行时会自动在工作目录新建空白的database.db文件,而非读取db文件夹下的已有库,自然找不到已创建的表。 - 事务逻辑缺失:
add_symbols_to_list函数执行插入操作后未调用commit()提交事务,修改不会实际落库,看起来就像操作没执行。 - PyCharm索引未同步:PyCharm的数据库提示依赖手动配置的数据源,路径不匹配或索引未更新时就会弹出
Unable to resolve table报错。 - 数据判断逻辑错误:你用于判断是否需要清空表的代码写法错误,
c.execute()返回的是游标对象,无论查询结果如何都会判定为真,会出现逻辑异常。
修复步骤
- 统一数据库连接路径
先通过脚本路径拼接获得数据库的绝对路径,确保任意工作目录下运行都能定位到正确的库文件,将所有数据库连接的地方统一替换为如下写法:
import os import sqlite3 import datetime import requests # 获取当前脚本的绝对目录 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 拼接db子文件夹下的数据库文件路径 DB_PATH = os.path.join(BASE_DIR, "db", "database.db")
后续连接数据库时统一使用sqlite3.connect(DB_PATH)即可。
- 补全事务提交与表创建逻辑
修改add_symbols_to_list函数,补全提交逻辑,同时增加表不存在时自动创建的逻辑:
def add_symbols_to_list(symbols_to_add) -> None: """将传入的标的列表添加到当月标的表中,保留原有数据 :param symbols_to_add: 用户传入的标的字符串列表 """ conn = sqlite3.connect(DB_PATH) c = conn.cursor() # 表不存在时自动创建 c.execute("""CREATE TABLE IF NOT EXISTS currentMonthStocks ( id INT PRIMARY KEY, symbol TEXT, month INT)""") time_now = datetime.datetime.now() this_month_int = time_now.month extra_symbols = symbols_to_add for i in range(len(extra_symbols)): c.execute("""INSERT INTO currentMonthStocks (symbol, month) VALUES (?, ?)""", (extra_symbols[i], this_month_int)) print("Added a symbol") # 提交事务落库 conn.commit() conn.close() print("Symbols successfully populated into currentMonthStocks table in database.db")
- 修正表清空的判断逻辑
修改get_symbols_at_month_start函数中的判断逻辑,正确获取查询结果再做判定:
def get_symbols_at_month_start() -> None: """月初调用该函数,清空当月标的表后插入新的当月交易标的列表 :return: None """ # 此处省略请求接口的原有代码 response = requests.request("POST", url, headers=headers, data=payload) symbols = response.json()['content']['allInstrumentRows'] this_months_symbols = [symbol['Symbol'] for symbol in symbols] conn = None try: conn = sqlite3.connect(DB_PATH) c = conn.cursor() print("Database Connected") c.execute("""CREATE TABLE IF NOT EXISTS currentMonthStocks ( id INT PRIMARY KEY, symbol TEXT, month INT)""") # 正确获取查询结果判断是否有数据 c.execute("SELECT EXISTS(SELECT 1 FROM currentMonthStocks WHERE id=1 LIMIT 2);") if c.fetchone()[0] == 1: c.execute("DELETE FROM currentMonthStocks") print("Delete all rows successful") time_now = datetime.datetime.now() this_month_int = time_now.month db_row_id = 1 for i in range(len(this_months_symbols)): c.execute("""INSERT INTO currentMonthStocks (id, symbol, month) VALUES (?, ?, ?)""", (db_row_id, this_months_symbols[i], this_month_int)) db_row_id += 1 print("Symbols successfully populated into currentMonthStocks table in database.db") conn.commit() print("Entries committed to database.db") except sqlite3.Error as e: print("sqlite3 error", e) finally: if conn: conn.close() print("Database.db Closed")
- 修复PyCharm提示报错
打开PyCharm右侧边栏的「Database」面板,点击+号选择「Data Source」→「SQLite」,在「File」路径栏选择项目下db文件夹内的database.db文件,点击「Apply」等待索引同步完成即可消除悬停报错。
内容的提问来源于stack exchange,提问作者Will Powers
相关产品推荐
相关产品推荐

