You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()返回的是游标对象,无论查询结果如何都会判定为真,会出现逻辑异常。

修复步骤

  1. 统一数据库连接路径
    先通过脚本路径拼接获得数据库的绝对路径,确保任意工作目录下运行都能定位到正确的库文件,将所有数据库连接的地方统一替换为如下写法:
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)即可。

  1. 补全事务提交与表创建逻辑
    修改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")
  1. 修正表清空的判断逻辑
    修改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")
  1. 修复PyCharm提示报错
    打开PyCharm右侧边栏的「Database」面板,点击+号选择「Data Source」→「SQLite」,在「File」路径栏选择项目下db文件夹内的database.db文件,点击「Apply」等待索引同步完成即可消除悬停报错。

内容的提问来源于stack exchange,提问作者Will Powers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:09:03