Python sqlite3.OperationalError:没有这样的表:

问题描述 投票:0回答:8

我正在尝试存储有关学校学生的数据。我之前已经做过几张表,例如一张用于密码和教师的表,稍后我会将它们合并到一个程序中。

我几乎从其中之一复制了创建表函数,并将值更改为学生信息。它在其他程序上运行良好,但我不断收到:

sqlite3.OperationalError: no such table: PupilPremiumTable

当我尝试向表中添加学生时,它出现在线路上:

cursor.execute("select MAX(RecordID) from PupilPremiumTable")

我查看文件夹,有一个名为

PupilPremiumTable.db
的文件,并且之前已经创建了该表,所以我不知道为什么它不起作用。

这是我的一些代码,如果您需要更多,请随时告诉我,正如我之前所说的那样,它以前有效,所以我不知道为什么它不起作用,甚至不知道什么不起作用:

with sqlite3.connect("PupilPremiumTable.db") as db:
    cursor = db.cursor()
    cursor.execute("select MAX(RecordID) from PupilPremiumTable")
    Value = cursor.fetchone()
    Value = str('.'.join(str(x) for x in Value))
    if Value == "None":
        Value = int(0)
    else:
        Value = int('.'.join(str(x) for x in Value))
    if Value == 'None,':
        Value = 0
    TeacherID = Value + 1
    print("This RecordID is: ",RecordID)
python database sqlite
8个回答
97
投票

您假设当前工作目录与脚本所在的目录相同。这不是您可以做出的假设。您的脚本正在另一目录中打开一个new数据库,该目录是空的。

使用数据库文件的绝对路径。您可以将其基于脚本的绝对路径:

import os.path

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
db_path = os.path.join(BASE_DIR, "PupilPremiumTable.db")
with sqlite3.connect(db_path) as db:

如果您想弄清楚在哪里打开新的数据库文件,您可以使用

os.getcwd()
来验证当前工作目录是什么;您可能想清理在那里创建的额外文件。


5
投票

我遇到了同样的问题,这是我解决的方法。

  1. 我按 Ctrl+C 杀死了服务器
  2. 我删除了 pychache 文件夹。您将在项目文件夹中找到此文件夹。
  3. 我删除了 sqlite 数据库。
  4. 我使用
    python manage.py makemigrations <app_name>
    进行了迁移,其中 是包含导致错误的模型的特定应用程序。就我而言,它是邮件应用程序,所以我运行了 python manage.py makemigrations 应用程序。
  5. 我按照正常方式迁移了。
  6. 然后我启动了服务器,一切就解决了。

我相信问题正如豪尔赫·卡德纳斯所说:

也许您正在将视图或查询加载到数据库,但还没有 为 Django 提供了足够的时间将模型迁移到数据库。这就是为什么 “表不存在”。

此解决方案基于此 youtube 视频


1
投票

首先,您需要检查该表是否 100% 存在于数据库中。您可以使用 sqlite 查看器:https://inloop.github.io/sqlite-viewer/.

如果该表存在,那么您可以在

''
中写入您的表名称,例如:

Select * from 'TableName'

无论您的查询是什么,我只是使用

Select *
作为示例。


0
投票

我必须面对同样的问题,有几种方法,但我认为最有可能的一种。

也许您正在将视图或查询加载到数据库,但您没有给 Django 足够的时间将模型迁移到数据库。这就是为什么“表不存在”。

确保在视图的代码中使用这种初始化:

form RegisterForm(forms.Form):

    def __init__(self, *args, **kwargs):
        super(RegisterForm, self).__init__(*args, **kwargs)

第二种方法是清理以前的迁移,删除数据库并重新开始迁移过程。


0
投票

我在关注 Flask 博客教程时遇到了同样的问题。当数据库开始给我 sqlite3.OperationalError: 时,我已经初始化了一次数据库,然后我尝试再次初始化,结果发现我的架构和 db.py 文件中有很多错误。修复它们并再次初始化,它起作用了。


0
投票

添加这个对我有用:

import os.path

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
db_dir = (BASE_DIR + '\\PupilPremiumTable.db')

请注意,需要在

\\
之前添加
PupilPremiumTable.bd
才能使代码正常工作。


0
投票

只需检查您在第一个执行命令中创建的表的名称。它必须与您要插入条目的表的名称相匹配。


0
投票

就我而言,问题是架构文件中的语法错误(例如缺少逗号)。

最初,我能够通过在执行之前打印出模式来绕过此错误(由于某种原因 sqlite 没有抛出错误)。但后来应用程序中出现了更难调试的错误,例如

sqlite3.OperationalError: no such table:

© www.soinside.com 2019 - 2024. All rights reserved.