Значения форм не будут храниться в моей базе данных SQLite, в то время как другие будут - PullRequest
0 голосов
/ 09 апреля 2019

Я строю динамическую форму, в которой мои текстовые поля хранятся в двух таблицах: тесты и вопросы. Таблица вопросов имеет внешний ключ, чтобы определить, к какому тесту они относятся. Однако, хотя мои вопросы правильно сохраняются в таблице вопросов, информация об опросе (год и заголовок) не сохраняется в моей таблице тестов. Я изучал код в течение нескольких дней, но не могу понять проблему.

Это код колбы:

def register_quiz():
try:
    print("register_quizzes")
    db=sqlite3.connect(dbname)
    print(sqlite3.version)
    db.row_factory = sqlite3.Row
    cursor = db.cursor()
    print("Title = " + request.form['title'])
    cursor.execute('''INSERT INTO quizzes (year, title) VALUES (?,?)''', (request.form['year'], request.form['title']))
    db.commit()
except Error as e:
    print(e)

Я создаю таблицу здесь

def create_quizzes():
    cursor = db.cursor()
    cursor.execute('''CREATE TABLE IF NOT EXISTS quizzes
              (quizid INTEGER PRIMARY KEY,
              year INT, topic VARCHAR,
              title VARCHAR)''')
db.commit()

А это код формы:

<fieldset id="field">
<legend>Quiz Storage</legend>
<tr>Title: <input type="text" name="title" id="title" placeholder="Title" value="{{request.form.title}}"></tr><br>
<p>Year: <select name="year" id="schoolyear" value="{{request.form.year}}">
     <option value="1">7</option>
     <option value="2">8</option>
     <option value="3">9</option>
     <option value="4">10</option>
     <option value="5">11</option>
     <option value="6">12</option>
     <option value="7">13</option></select></p>

Я что-то пропустил или есть где-то ошибка? Пожалуйста, что-нибудь поможет!

1 Ответ

0 голосов
/ 10 апреля 2019

Ваша проблема может быть связана с

1.) Проблемы с внешними ключами, на которые нет правильной ссылки

2.) Тройные одинарные кавычки в запросах sql

Позволяетначать с внешнего ключа

Это такие вещи, которые вам нужно знать.

Между Вопросами и тесты какая из таблицродители и какой из них является дочерним, поскольку вы не указали их.

A родительская таблица - это таблица, на которую следует ссылаться, в то время как дочерняя таблица - это таблица, составляющаяreference

Предположим, что таблица вопросов - это родитель, а таблица опросов - это дочерний элемент.

. Предположим, что таблица вопросов содержит столбец с именем question_id int

, а таблица опросов содержитстолбец question_id, который ссылается на question_id родительской таблицы (Вопросы)

Чтобы сделать вставку, Вы должны сначала вставить ее в родители (Вопросы), прежде чем вставить ее в ребенка (Викторины) из-за ссылки question_id.

всякий раз, когда вы пытаетесь вставить в таблицу опросов, он проверяет, существует ли этот вопрос_иде в родительской таблице, прежде чем разрешить вставку, в противном случае он не будет вставлен.

Это потому, что родители его имеютбудет давать ребенку.

Если, например, question_id таблицы родителей имеет значение 1

, то для вставки в викторины, являющиеся дочерними, question_id таблицы викторин должен иметьзначение, которое соответствует этому от родителей и в данном случае 1.

Сначала вы попытаетесь вставить непосредственно в sqlite и увидите, что вставка работает как для таблицы родителей (вопросы), так и для таблицы ребенка (тесты), прежде чем сказать, чтопроблема в коде вашей колбы.

решение 2

если внешний ключ не является вашей проблемой, тогда

Почему бы не использовать sql-alchemy , что просто и понятно.

Опять же. Почему вы используете тройные одинарные кавычки в запросах sql.часто предпочтительнее инициализировать параметр формы перед передачей его в sql-запросы

что-то вроде

yr = request.form['year']
tit = request.form['title']
cursor.execute("INSERT INTO quizzes (year, title) VALUES (?,?)", (yr,tit))

, так что вы можете попробовать это

def register_quiz():
try:

    yr = request.form['year']
    tit = request.form['title']

    print("register_quizzes")
    db=sqlite3.connect(dbname)
    print(sqlite3.version)
    db.row_factory = sqlite3.Row
    cursor = db.cursor()
    print("Title = " + request.form['title'])
    cursor.execute("INSERT INTO quizzes (year, title) VALUES (?,?)", (yr,tit))
    db.commit()
except Error as e:
    print(e)

в качестве альтернативы.Я также переписал ваш код ниже, чтобы обеспечить работоспособность.просто измените соединение с БД, чтобы оно соответствовало вашему, и выполните настройку, где необходимо html

<html>
   <body>
      <form action = "{{ url_for('register_quiz') }}" method = "POST">
         <fieldset id="field">
<legend>Quiz Storage</legend>
<tr>Title: <input type="text" name="title" id="title" placeholder="Title" value="{{request.form.title}}"></tr><br>
<p>Year: <select name="year" id="schoolyear" value="{{request.form.year}}">
     <option value="1">7</option>
     <option value="2">8</option>
     <option value="3">9</option>
     <option value="4">10</option>
     <option value="5">11</option>
     <option value="6">12</option>
     <option value="7">13</option></select></p>
      </form>
   </body>
</html>

app.py

@app.route('/register_quiz',methods = ['POST', 'GET'])
def register_quiz():
   if request.method == 'POST':
      try:
         yr = request.form['year']
         tit = request.form['title']


         with sql.connect("database.db") as con:
            cur = con.cursor()
            cur.execute("INSERT INTO quizzes (year, title) 
               VALUES (?,?)",(yr,tit) )

            con.commit()
            msg = "quiz successfully added"
      except:
         con.rollback()
         msg = "error in insert operation"

      finally:
         #return render_template("result.html",msg = msg)
         return 'success'
         con.close()
...