#python #sqlite #flask
Вопрос:
Я пытаюсь заставить это работать, и сообщение об ошибке ‘строка 49, в курсоре pushNumber.выполнить(строка запроса, последний номер) sqlite3.OperationalError: значение строки, использованное не по назначению, продолжает появляться. Кроме того, при использовании функции pop появляется следующее: ‘sqlite3.OperationalError: стек таблиц содержит 1 столбец, но было предоставлено 3 значения’
Я пытаюсь сделать так, чтобы при посещении веб-страницы /calc/push/50 она добавляла 50 в список, а затем создавала таблицу в базе данных стека. Когда я ввожу /calc/push/8, он добавляет 8 в список и вставляет это в базу данных. В одном столбце должен просто отображаться полный список, обновляемый каждый раз с помощью push, а в другом столбце должны отображаться все журналы любой функции, которую я использовал, с новой записью, вставляемой каждый раз под последней.
from flask import Flask, render_template
import sqlite3
from flask.wrappers import Request
app = Flask(__name__)
conn = sqlite3.connect('stack.db')
cursor = conn.cursor()
stackList = []
latestNumber = 0 #For pop/peek function
columnCreated = 0
#cursor.execute("""CREATE TABLE Stack (
# StackLogs text
# Stacklist text
# )""")
#conn.commit()
@app.route('/')
@app.route('/calc/')
@app.route('/calc/peek')
def calcPeek():
return render_template('peek.html', latestNumber=latestNumber) #Prints top of stack - recent number. Could also use [-1]
@app.route('/calc/push/<number>') #<> passes number as a variable
def pushNumber(number):
stackList.append(number)
global latestNumber
latestNumber = number #Assigns most recent number to this variable
print(stackList) #Prints to console so we can check the list
global columnCreated
columnCreated = 1
print(columnCreated)
if columnCreated == 1:
conn = sqlite3.connect('stack.db')
cursor = conn.cursor()
stack_string = ', '.join('?' * len(stackList))
query_string = 'INSERT INTO Stack VALUES (%s);' % stack_string
cursor.execute(query_string, stackList)
conn.commit()
conn.close()
elif columnCreated >= 2:
conn = sqlite3.connect('stack.db')
cursor = conn.cursor()
stack_string = ', '.join('?' * len(latestNumber))
query_string = 'UPDATE Stack SET StackLogs=(%s);' % stack_string
cursor.execute(query_string, latestNumber)
conn.commit()
conn.close()
return render_template('push.html', number=number, latestNumber=latestNumber)
@app.route('/calc/pop')
def calcPop():
global latestNumber
if stackList == []: #If empty, prints to console. Otherwise pops end off of list.
print("Stack is empty")
else:
stackList.pop() #Removes last value by default
conn = sqlite3.connect('stack.db')
cursor = conn.cursor()
stack_string = ', '.join('?' * len(stackList))
query_string = 'INSERT INTO Stack VALUES (%s);' % stack_string
cursor.execute(query_string, stackList)
conn.commit()
conn.close()
return render_template('pop.html', stackList=stackList, latestNumber=latestNumber)
Ответ №1:
Попробуйте удалить круглые скобки в вашем запросе :
UPDATE Stack SET StackLogs=%s;
INSERT INTO Stack VALUES %s;