2017-12-23 12 views
2

私は、herokuのPostgresデータベースにデータを挿入する際に混乱します。ここで Herokuデータベース:Insert操作

は私が

print(cursor.statusmessage)

それが返すことにより、SQLの状態を確認し、その後、

cursor = conn.cursor() 
cursor.execute("INSERT INTO users(username, useremail, userpass) VALUES ('"+_name+"','"+_email+"','"+_password+"')") 

私はデータベースへの接続を作成している

、実行した後、ことだ

INSERT 1

しかし、実行データの0 =

cursor.fetchall()それは私が/ユーザ/ ABC /」

ファイルのエラースロー

PycharmProjects/testSkillNetwork/app.py "、 line 75、signUp data = cursor.fetchall()。

ProgrammingError: no results to fetch 

だから、私は理解することができませんなぜ「何もありません」の挿入が成功しました。

ご協力いただければ幸いです。ありがとう。

答えて

1

SELECTクエリを発行してデータベースからデータを取得する必要があります。

cursor.execute("SELECT * FROM users") 
cursor.fetchall() 

これは、いくつかの結果をもたらすはずです。

また、データの挿入が完了したらトランザクションをコミットする必要があります。それ以外の場合は失われます。もう1つ大きな問題は、クエリを構成する方法がSQLインジェクションに対して脆弱であるということです。データベースアダプタがcursor.execute()に渡された引数のタプルから値を持つプレースホルダ(%s)を代用します。このスタイルで

cursor.execute("INSERT INTO users(username, useremail, userpass) VALUES (%s, %s, %s)", (_name,_email,_password)) 

:むしろ文字列の連結を使用するよりも、あなたはパラメータ化クエリを使用する必要があります。これがより安全なだけでなく、読みやすく、管理しやすくなります。

+0

conn.commit()はデータベースに値を挿入し、実際にはこの行を持っていましたが、fetchall()の後には実行されませんでした。そしてチップのおかげで。私はそのようなプロジェクトをやっている最初の時間は、Androidの開発からシフト... – adafrwefsefr

1

psycopg2を使用していると仮定して、どのドライバを使用してデータベースに接続しているのかわかりません。これは、最も有名なものの1つで、通常の動作です。 hereからの読み込み:

A ProgrammingError is raised if the previous call to execute*() did not produce any result set or no call was issued yet. 

insert文には結果を生成しない、他のその障害が発生した場合にエラーが発生しました。あなたはあなただけ挿入した行を取得したい場合は、もう一度データベースを照会:

cur.execute("SELECT * FROM users;") 
cur.fetchall() 

、これはあなたの行を与えるだろう。これとは別に

、クエリを実行するとき、それはSQL injection attacksにそれが脆弱になりますので、あなたが、basic usageとパラメータ化クエリのセクション、決して使用Pythonの文字列の連結を読めば。

関連する問題