【问题标题】:Python Flask inserting data from formPython Flask从表单插入数据
【发布时间】:2017-07-22 02:48:05
【问题描述】:

这是一个初学者尝试使用烧瓶将数据插入到 mysql 表中。我可以在表单中输入数据,但它不会插入数据。我在使用pythonanywhere,所以错误信息不清楚...

Transactions.html:

 <h1>Enter a Transaction</h1>

 <form action="/transactions" method=post>
     <dl>
         <dt>Sale Item:
         <dd><input type=text name="Item" required/>
         <dt>Shack:
         <dd><input type=text name="Shack" required/>
         <dt>Reference:
         <dd><input type=text name="Paym_Reference" required/>
         <dt>Amount:
         <dd><input type=text name="Amount" required/>
     </dl)
     <br>
<p><input type=submit value=Enter>
  </form>

MySQL:transactions

+----------------+-------------+------+-----+---------+----------------+
| Field          | Type        | Null | Key | Default | Extra          |
+----------------+-------------+------+-----+---------+----------------+
| trans_id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| Item           | varchar(20) | YES  |     | NULL    |                |
| Shack          | varchar(10) | YES  |     | NULL    |                |
| Paym_Reference | varchar(20) | YES  |     | NULL    |                |
| Amount         | int(10)     | YES  |     | NULL    |                |
+----------------+-------------+------+-----+---------+----------------+

代码:

import MySQLdb as my
conn = my.connect ('hello.mysql.pythonanywhere-services.com','hello','password','SIIL$Transactions')
c = conn.cursor ()

@app.route('/add_data', methods=['GET', 'POST'])
def add_data():
    Item= request.form('Item')
    Shack= request.form('Shack')
    Paym_Reference= request.form('Paym_Reference')
    Amount= request.form('Amount')
    c.execute("INSERT INTO transactions(Item, Shack, Paym_Reference, Amount) VALUES ('',%s,%s,%s,%s)")
    conn.commit()
    return 'Done'

@app.route('/transactions', methods=['GET', 'POST'])
def transactions():
    add_data()
    return render_template('Transactions.html')

【问题讨论】:

    标签: python html flask mysql-python pythonanywhere


    【解决方案1】:

    这里的 PythonAnywhere 开发人员 -- 您应该在我们的系统上收到与其他系统相同的错误消息 -- 您是否检查了您的网络应用程序的错误日志?

    您的代码存在一些问题。正如 Stanislav Filin 所说,您传递给 c.execute 的 SQL 中的空字符串不应该存在;您指定了四列,因此您只需要四个值。

    但是你还需要传入一些值来插入。 SQL 字符串只是一个发送到数据库的命令,当它这样做时,您需要告诉系统用什么值替换 %ss。

    所以不是

    c.execute("INSERT INTO transactions(Item, Shack, Paym_Reference, Amount) VALUES ('',%s,%s,%s,%s)")
    

    ...你应该有

    c.execute("INSERT INTO transactions(Item, Shack, Paym_Reference, Amount) VALUES (%s,%s,%s,%s)", (Item, Shack, Paym_Reference, Amount))
    

    更多示例请参见this help page

    最后一件事——直接在 Flask 应用程序中使用 MySQL 库将非常困难。使用它涉及很多复杂性,尤其是在连接管理方面。您在上面提供的代码将适用于您网站的单个用户,并且只要它的空闲时间不超过数据库的连接超时(在 PythonAnywhere 上为 5 分钟),但它会因令人困惑的错误消息而中断。

    SQLAlchemy 是一个出色的工具,您可以将它放在 Flask 代码和数据库之间,它可以很好地处理连接管理和许多其他事情,并且可以节省您的工作量。大约一年前我写了a blog post on building a database-backed website with Flask and SQLAlchemy,我真的建议你看看。

    【讨论】:

    • 谢谢@Giles。我已经阅读了您的教程,并尝试使用 SQLalchemy。想想就快到了,但卡在这里:http://stackoverflow.com/questions/42579079/flask-post-data-to-table-using-sqlalchemy-mysql
    【解决方案2】:

    你在 SQL 查询中有错误

    您的代码:

    c.execute("INSERT INTO transactions(Item, Shack, Paym_Reference, Amount) VALUES ('',%s,%s,%s,%s)")
    

    正确插入

    c.execute("INSERT INTO transactions(Item, Shack, Paym_Reference, Amount) VALUES (%s,%s,%s,%s)")
    

    来自w3schools的另一个例子

    INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
    VALUES ('Cardinal','Tom B. Erichsen','Skagen 21','Stavanger','4006','Norway');
    

    【讨论】:

      猜你喜欢
      • 2019-02-25
      • 1970-01-01
      • 2020-08-16
      • 2015-10-31
      • 2017-06-14
      • 2014-08-13
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多