2017-03-02 4 views
0

これは、フラスコを使用してmysqlテーブルにデータを挿入する初心者の試みです。フォームにデータを入力できますが、データは挿入されません。私はpythonanywhereを使用していますので、エラーメッセージが...Python Flaskフォームからデータを挿入する

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

答えて

1

あなたは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'); 
2
ここ

PythonAnywhereの開発 - あなたは、任意の上として、当社のシステム上で同じエラーメッセージを取得する必要がありますその他 - あなたのWebアプリケーションのエラーログをチェックしましたか?

コードにはいくつかの問題があります。 Stanislav Filinと同様に、c.executeに渡すSQLの空の文字列は存在してはいけません。 4つの列を指定しているので、4つの値しか必要ありません。

しかし、挿入するためにいくつかの値を渡す必要もあります。 SQL文字列はデータベースに送信するコマンドに過ぎず、そのときには%sを置き換える値をシステムに通知する必要があります。

ので、代わりの

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

...あなたはより多くの例を参照してくださいthis help page

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

を持つ必要があります。

最後に、Flaskアプリケーションで直接MySQLライブラリを使用することは非常に難しいでしょう。それを使用することには、特に接続管理に関して多くの複雑さが伴います。上記のコードは、あなたのサイトの1人のユーザのために働き、データベースの接続タイムアウト(PythonAnywhereでは5分)よりも長くアイドル状態でない限り、混乱するエラーメッセージで壊れます。

SQLAlchemyは、Flaskコードと、接続管理やその他多くのことをうまく処理しているデータベースの間に置くことができ、手間を省くことができる優れたツールです。私はa blog post on building a database-backed website with Flask and SQLAlchemy年前に書きました、そして、私は本当にあなたが見てお勧めします。

+0

ありがとう@Giles。私はあなたのチュートリアルを終えて、SQLalchemyを使ってみました。ほぼそこにいると思うが、ここではまっていると思う: 'http:// stackoverflow.com/question/42579079/フラスコ - ポストデータ - テーブル - 使用 - sqlalchemy - mysql' – wazzahenry

関連する問題