【问题标题】:Form values won't store into my SQLite database, yet others will表单值不会存储到我的 SQLite 数据库中,但其他值会
【发布时间】:2019-04-09 14:25:29
【问题描述】:

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

这是烧瓶代码:

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>

我是否遗漏了什么或某处有错误?拜托,任何事情都会有帮助!

【问题讨论】:

    标签: database html sqlite flask request.form


    【解决方案1】:

    您的问题可能是由于

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

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

    让我们从外键开始

    它们是你需要知道的。

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

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

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

    假设问题表有一个名为 question_id an int 的列

    并且测验表有一个列 question_id,它引用了父表的 question_id(问题)

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

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

    这是因为这是父母拥有的,它会给孩子。

    如果例如 parent 表的 question_id 的值为 1

    然后在测验中插入孩子, quizzes 表的 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()
    

    【讨论】:

    • 我的建议是先删除这些外键,然后在实现外键之前查看插入是否可以直接从您的 sqlite 或您的应用程序中工作。谢谢
    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2016-04-02
    相关资源
    最近更新 更多