0

我正在构建一个动态表单,我的文本字段存储在两个表中:测验和问题。问题表有一个外键来标识它们属于哪个测验。但是,虽然我的问题正确存储到问题表中,但测验信息(年份和标题)不会存储到我的测验表中。我已经研究代码好几天了,但无法弄清楚问题所在。

这是烧瓶代码:

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>

我错过了什么或某处有错误吗?拜托,任何事情都会有帮助!

4

1 回答 1

0

您的问题可能是由于

1.) 未正确引用外键问题

2.) sql 查询中的三重单引号

让我们从外键开始

它们是如此你需要知道的事情。

问题测验之间,表中哪一个是父母,哪一个是孩子,因为您没有指定它们。

父表是要引用的表,子是进行引用的表

假设 Questions 表是父母,quizzes 表是孩子。

让我们假设问题表有一个名为 question_id 的列 int

并且 quizzes 表有一个列 question_id ,它引用了 parents 表的 question_id (Questions)

要进行插入,由于 question_id 引用,您必须先插入父母(问题),然后再插入孩子(测验)。

每当您尝试插入 quizzes 表时,它会在允许插入之前检查该 question_id 是否已存在于 parent 表中,否则将不会插入。

这是因为父母所拥有的,都会给予孩子。

例如,如果 parents 表的 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>

应用程序.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()
于 2019-04-10T17:50:18.973 回答