Python sqlite3.OperationalError: no such table:

51

我正在尝试存储学校学生的数据。我之前做了几个表格,比如密码和老师的表格,我以后会把它们合并到一个程序中。

我基本上复制了其中一个程序的“创建表”功能,并将值更改为学生的信息。这在其他程序上运行良好,但我一直收到以下错误消息:

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)

2
你创建了表 PupilPremiumTable 吗? - Bhargav Rao
请注意,如果您有一个名为“PupilPremiumTable.db”的文件,并不意味着您有一个名为“PupilPremiumTable”的表。 - Bhargav Rao
我已经尝试连接PupilPremiumTable和PupilPremiumTable.db。当我将以下行更改为:with sqlite3.connect("PupilPremiumTable") as db:时,它没有出现错误,但仍然停留在同一位置,当我将以下行更改为:cursor.execute("select MAX(RecordID) from PupilPremiumTable.db")时也是同样的情况。 - Ben
你展示的代码并没有创建表格。 - CL.
1
@BhargavRao:表存在,数据库也存在,但是使用相对路径打开它会在当前工作目录中打开。当前工作目录可以是任何东西,并取决于脚本的启动方式。 - Martijn Pieters
显示剩余2条评论
7个回答

94

您假设当前工作目录与脚本所在目录相同,这是您不能做出的假设。您的脚本正在打开一个位于不同目录中、空的数据库。

请为您的数据库文件使用绝对路径。您可以基于脚本的绝对路径来确定它:

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()来验证当前工作目录是什么;您可能想要清理掉您在那里创建的额外文件。


4
我曾经遇到了同样的问题,以下是我解决它的步骤:
  1. 按Ctrl+C键关闭服务器
  2. 删除pychache文件夹。你可以在项目文件夹中找到该文件夹。
  3. 删除sqlite数据库。
  4. 使用python manage.py makemigrations <app_name>命令进行迁移,其中<app_name>是包含导致错误的模型的特定应用程序名称。在我的情况下,是邮件应用程序,所以我运行了python manage.py makemigrations app。
  5. 正常迁移数据库。
  6. 然后启动服务器,问题就解决了。
我认为这个问题如Jorge Cardenas所说的那样:

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

此解决方案基于此YouTube视频

在更新conda环境中的Python后,旧版本Python中仍存在一个db实例。因此,删除pycache并重新创建db是有帮助的。 find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete - Alsushi

1

首先,您需要检查该表在数据库中是否存在。您可以使用sqlite viewer进行检查: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文件中有很多错误。修复它们并再次初始化,问题得到解决。

具体的错误是关于“没有这个表”。如果您描述了您收到的“大量错误”以及您如何“修复它们”,那么这个答案会更有帮助。 - Gino Mempin
我遇到了一个错误:sqlite3.OperationalError: no such table: user。这个错误是因为在我的schema.sql文件中,我的user表格有语法错误。我忘记加逗号了。修复了语法错误并重新初始化数据库,错误就消失了。 - Oscar Morales

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

0

我加了这个,对我有用:

import os.path

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

请注意,在代码中PupilPremiumTable.bd之前需要加上\\才能使其正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接