我正在尝试存储有关学校学生的数据。我之前已经做过几张表,例如一张用于密码和教师的表,稍后我会将它们合并到一个程序中。
我几乎从其中之一复制了创建表函数,并将值更改为学生信息。它在其他程序上运行良好,但我不断收到:
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)
您假设当前工作目录与脚本所在的目录相同。这不是您可以做出的假设。您的脚本正在另一目录中打开一个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()
来验证当前工作目录是什么;您可能想清理在那里创建的额外文件。
我遇到了同样的问题,这是我解决的方法。
python manage.py makemigrations <app_name>
进行了迁移,其中 我相信问题正如豪尔赫·卡德纳斯所说:
也许您正在将视图或查询加载到数据库,但还没有 为 Django 提供了足够的时间将模型迁移到数据库。这就是为什么 “表不存在”。
此解决方案基于此 youtube 视频
首先,您需要检查该表是否 100% 存在于数据库中。您可以使用 sqlite 查看器:https://inloop.github.io/sqlite-viewer/.
如果该表存在,那么您可以在
''
中写入您的表名称,例如:
Select * from 'TableName'
无论您的查询是什么,我只是使用
Select *
作为示例。
我必须面对同样的问题,有几种方法,但我认为最有可能的一种。
也许您正在将视图或查询加载到数据库,但您没有给 Django 足够的时间将模型迁移到数据库。这就是为什么“表不存在”。
确保在视图的代码中使用这种初始化:
form RegisterForm(forms.Form):
def __init__(self, *args, **kwargs):
super(RegisterForm, self).__init__(*args, **kwargs)
第二种方法是清理以前的迁移,删除数据库并重新开始迁移过程。
我在关注 Flask 博客教程时遇到了同样的问题。当数据库开始给我 sqlite3.OperationalError: 时,我已经初始化了一次数据库,然后我尝试再次初始化,结果发现我的架构和 db.py 文件中有很多错误。修复它们并再次初始化,它起作用了。
添加这个对我有用:
import os.path
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
db_dir = (BASE_DIR + '\\PupilPremiumTable.db')
请注意,需要在
\\
之前添加 PupilPremiumTable.bd
才能使代码正常工作。
只需检查您在第一个执行命令中创建的表的名称。它必须与您要插入条目的表的名称相匹配。
就我而言,问题是架构文件中的语法错误(例如缺少逗号)。
最初,我能够通过在执行之前打印出模式来绕过此错误(由于某种原因 sqlite 没有抛出错误)。但后来应用程序中出现了更难调试的错误,例如
sqlite3.OperationalError: no such table:
。