Python Flask从表单插入数据

时间:2017-03-02 11:35:05

标签: python html flask mysql-python pythonanywhere

这是初学者尝试使用flask将数据插入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')

2 个答案:

答案 0 :(得分:3)

PythonAnywhere开发人员 - 您应该在我们的系统上获得与其他任何错误消息相同的错误消息 - 您是否检查了Web应用程序的错误日志?

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

但是你还需要传入一些值来插入。 SQL字符串只是一个发送到数据库的命令,您需要告诉系统将%s替换为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))

......你应该

kinematic-body

有关更多示例,请参阅this help page

最后一件事 - 直接在Flask应用程序中使用MySQL库将会非常困难。使用它涉及许多复杂性,特别是在连接管理方面。您上面提供的代码将适用于您站点的单个用户,并且只有在它闲置的时间超过数据库的连接超时(PythonAnywhere上的五分钟)时才会有效,但是它会中断有令人困惑的错误消息。

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

答案 1 :(得分:1)

你在SQ​​L查询中有错误

您的代码:

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');