插入表的Python SQLite数据消失了吗?

时间:2018-10-17 11:40:38

标签: python sqlite flask

因此,这让我感到困惑,标题并没有真正解释清楚。我有一个网页,当用户从下拉列表中进行选择时,该网页会通过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不能访问表
  • 没有引发异常

我可以真的解决这个问题,因为我完全不了解这里的问题,并且已经解决了几个小时。

经过更多测试之后,我确定这与所创建表的范围有关。我不确定如何或为什么,但是我似乎只能访问在该调用中添加到表中的数据,从先前调用中添加的任何数据都不存在,这使我认为表数据仅在本地存在。呼叫访问它,这不是全局的吗?

1 个答案:

答案 0 :(得分:1)

只是设法弄清楚了。我知道这与在全球范围内看不到本地更改有关。环顾四周后,我意识到如果不使用connection.commit()保存所做的更改,这将是我要解决的确切问题。我现在已经添加了它,并且所做的更改现在可以在所有呼叫中看到并且可以正常工作。