【问题标题】:Python sqlite3.OperationalError: no such table:Python sqlite3.OperationalError:没有这样的表:
【发布时间】:2015-01-24 13:44:46
【问题描述】:

我正在尝试存储有关学校学生的数据。我之前做过几张表格,比如一张用于密码和教师的表格,稍后我将把它们放在一个程序中。

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

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)

【问题讨论】:

  • 你有没有创建表PupilPremiumTable
  • 是的,该表之前已经创建过,如果不清楚,请见谅。它与此 python 文件位于同一文件夹中。
  • 请注意,如果您有一个名为 PupilPremiumTable.db 的文件,并不意味着您有一个名为 PupilPremiumTable 的表
  • 我已经尝试连接到 PupilPremiumTable 和 PupilPremiumTable.db。当我更改线路时:with sqlite3.connect("PupilPremiumTable.db") as db:with sqlite3.connect("PupilPremiumTable") as db: 它没有抛出错误,但仍然卡在同一个地方,当我将 cursor.execute("select MAX(RecordID) from PupilPremiumTable") 更改为 cursor.execute("select MAX(RecordID) from PupilPremiumTable.db") 时,同样的事情
  • @BhargavRao:表存在,数据库存在,但是通过使用相对路径,您可以在当前工作目录中打开它。当前工作目录可以是任何内容,具体取决于脚本的启动方式。

标签: python database sqlite


【解决方案1】:

您假设当前工作目录与您的脚本所在的目录相同。这不是您可以做出的假设。您的脚本正在另一个目录中打开一个 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() 验证当前工作目录是什么;你可能想清理你在那里创建的额外文件。

【讨论】:

    【解决方案2】:

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

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

    我相信问题正如 Jorge Cardenas 所说:

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

    这个解决方案是基于这个youtube video

    【讨论】:

    • 在 conda env 中更新 python 后,旧 python 版本中仍有一个 db 实例。所以删除 pycache 并重新创建 db 很有帮助 find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
    【解决方案3】:

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

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 具体错误是关于“没有这样的表”。如果你描述了你得到了什么“很多错误”以及你是如何“修复它们”的,这个答案会更有帮助。
      • sqlite3.OperationalError: no such table: user 是我遇到的错误。我收到此错误是因为在我的 schema.sql 中我的用户表中有语法错误。我忘了加上昏迷。修复语法错误并再次初始化数据库,错误消失了。
      【解决方案5】:

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

      如果表存在,那么你可以在''中写下你的表名,例如:

      Select * from 'TableName'
      

      无论您的查询是什么,我只是以Select * 为例。

      【讨论】:

        猜你喜欢
        • 2021-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        • 2016-02-20
        • 2018-08-18
        • 2022-01-21
        相关资源
        最近更新 更多