因此,这让我感到困惑,标题并没有真正解释清楚。我有一个网页,当用户从下拉列表中进行选择时,该网页会通过AJAX调用由flask处理的网址。它首先发出对/teamSelected
的调用,我的python在其中抓取了有关这两支球队之间足球比赛的一些信息,并将其放在相应命名的表中并返回。
之后,对/requestCommentary
进行第二次AJAX调用,然后在python中从表中检索该数据并返回。
问题:
当我第一次调用/teamSelected
时,我有删除表(如果存在)的代码。之后,我检查该表是否存在(似乎很奇怪,但是每次调用该表时都要删除该表,只是确保输入程序的if
部分,以便我可以测试其中的所有功能)。之后,如果该表不存在,它将进入if
部分,在其中创建表,将数据抓取并存储在表中。如果我随后尝试打印表的内容,即使告诉我仅存在1行,它也会完美地将它们吐出?
但是,如果我从一开始删除删除表的代码,然后尝试打印内容,则不会打印任何内容。
对我来说,这毫无意义。如果该表不存在,请创建该表,并用数据填充它,然后可以访问它。但是,如果我注释掉drop table语句,则下次调用该表存在并且未被删除,因此我应该能够访问它,但是那里不再有数据。如果我猜到了,那几乎就像是仅针对该调用创建表,然后在此表销毁,因此后续调用无法访问它?
/ teamSelected -收集数据,添加到数据库
@app.route("/teamSelected", methods=['POST', 'GET'])
def new():
try:
connection = sqlite3.connect("commentary.db")
cursor = connection.cursor()
except:
print("COULD NOT CONNECT TO DATABASE")
data = request.get_data() #gets data passed via AJAX call
splitData = data.decode().replace("\"", "").split("__") #data contains different elements split up by "__"
homeTeam = splitData[0]
awayTeam = splitData[1]
tableName = homeTeam + awayTeam + splitData[2] #unique table name
cursor.execute("DROP TABLE if exists "+tableName) #drops table to ensure enters if statement
cursor.execute("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='"+tableName+"';")
result = cursor.fetchone()
number_of_rows = result[0]
print("R O W S " + str(number_of_rows)) #Always prints 0
if(number_of_rows == 0):
create_table_string = "create table if not exists '"+ tableName + "' (id INTEGER PRIMARY KEY, commentary TEXT, time TEXT)"
cursor.execute(create_table_string)
def scrapeInfo():
...
#scraping stuff
...
maxUpdate = 5
updateNumber = 0
while updateNumber < maxUpdate:
cursor.execute("INSERT INTO "+tableName+"(commentary, time) VALUES(?,?)", (commentaryUpdates[updateNumber], times[updateNumber]))
#inserts scraped data into table
updateNumber += 1
cursor.execute("select * from " + tableName)
rows = cursor.fetchall()
for row in rows:
print(row)
#THIS ^ works
cursor.execute("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='" + tableName + "';")
result = cursor.fetchone()
number_of_rows = result[0]
print(number_of_rows)
#This ^ prints 1 despite the above for loop printing 5 rows
return jsonify("CLEAN")
return scrapeInfo()
#This is only hit if the table exists, meaning it doesn't enter
#the if statement, so this section is only hit when the drop table
#statement above is commented out. Here, this prints nothing, no idea why.
cursor.execute("select * from " + tableName)
rows = cursor.fetchall()
for row in rows:
print(row)
/ RequestCommentary -从表中检索数据
@app.route("/requestCommentary", methods=['POST', 'GET'])
def getCommentary():
data = request.get_data()
splitData = data.decode().replace("\"", "").split("__")
homeTeam = splitData[0]
awayTeam = splitData[1]
tableName = homeTeam + awayTeam + splitData[2]
#Here I'm trying to retrieve the data from the table, but nothing is printed
cursor.execute("select * from " + tableName)
rows = cursor.fetchall()
for row in rows:
print(row)
return jsonify("CLEAN")
回顾一下意外行为:
Number_of_rows
插入数据打印1之后(可能与打印5一样重要)/RequestCommentary
不能访问表我可以真的解决这个问题,因为我完全不了解这里的问题,并且已经解决了几个小时。
经过更多测试之后,我确定这与所创建表的范围有关。我不确定如何或为什么,但是我似乎只能访问在该调用中添加到表中的数据,从先前调用中添加的任何数据都不存在,这使我认为表数据仅在本地存在。呼叫访问它,这不是全局的吗?
答案 0 :(得分:1)
只是设法弄清楚了。我知道这与在全球范围内看不到本地更改有关。环顾四周后,我意识到如果不使用connection.commit()
保存所做的更改,这将是我要解决的确切问题。我现在已经添加了它,并且所做的更改现在可以在所有呼叫中看到并且可以正常工作。