我遇到了 sqlite3 和 python cmd 库的问题。 我正在制作一个简单的 shell 应用程序,以使用 sqlite3 从数据库生成热身练习的随机样本。 这是完整的代码,因为它相当短:
import cmd
import sqlite3
from random import randint, sample
# Connect database & create cursor
db = sqlite3.connect('warmupsdb')
cursor = db.cursor()
# Get every exercise in the database
warmupsdb = cursor.execute("SELECT * FROM warmups").fetchall()
# Get the length of the database for error checking
warmupslen = len(warmupsdb)
class warmups(cmd.Cmd):
intro = "Hello World !"
prompt = "warmups > "
"""Simple cmd program."""
def do_gen (self, number):
if is_validInt(number):
number = int(number)
gen = sample(warmupsdb, number)
for output in gen:
print(output[1])
else:
print("Please provide a valid number.")
def do_add(self, text):
cursor.execute("INSERT INTO warmups (warmupName) VALUES (?)", (text,))
db.commit()
def do_exit(self,line):
db.close()
return True
if __name__ == '__main__':
warmups().cmdloop()
我的问题出现在
do_add()
功能中,没有出现错误,但提交的更改不会出现在应用程序中,直到我重新启动它。
例如,如果我的数据库有样本:
"Test 1", "Test 2", "Test 3"
我使用命令
add Test 4
gen
命令永远不会返回“测试4”,因为它似乎尚未在数据库中,这不是我想要的行为,我希望能够生成在当前实例期间添加的样本。
我尝试在 sqlite3 和 cmd 的文档中查找信息,以及有关此特定问题的信息,但关于 cmd 库与 sql 数据库结合使用的信息并不多。
项目已添加到数据库中,但您使用在脚本开头通过 SELECT 语句获取的旧数据。
warmupsdb = cursor.execute("SELECT * FROM warmups").fetchall()
您需要更新您操作的数据。 例如。函数 do_add 可以通过以下数据刷新来扩展:
global warmupsdb
warmupsdb = cursor.execute("SELECT * FROM warmups").fetchall()