2016-07-07 14 views
1

私はPythonをMySQLで使用して学習しています。同じクエリは、MysqlとPyMySQLの動作が異なります。たとえば、MySQLコンソールでは、「ページ」という名前のテーブルがあります。PyMySQLを使用しているときに無効な構文

INSERT INTO pages (title,content) VALUES ("test title","test content") 

これは機能します。 PythonではPyMySQLをインポートし、接続を作成してcursor = "cur"と入力します。実行すると:

cur.execute("INSERT INTO pages (title,content) VALUES ("test title","test content")") 

..エラーが発生します。構文が無効です。しかし、私がプレースホルダでこれを試してみると:

cur.execute("insert into pages (title,content) values (%s,%s)",("test title","test content")) 

それが動作します!だから私はMySQLで同じクエリがPythonで動作するのをなぜ混同していましたか?それはPyMySQLを使用するときに必ずプレースホルダを使用するべきですか?あなたが全く出データベースドライバのフィギュアをさせるプレースホルダの前後に引用符を置く必要がないので

おかげで、すべての

+1

はいあなたはパラメータ化クエリを使用する必要があります。しかし、動作しない文を見た場合、二重引用符をどのように使用しているか考えてみてください。あなたは基本的にあなたの文字列を閉じています - 代わりに単一引用符を使用してください。 – sgeddes

+0

ええ、そんなルーキーミスがあります –

答えて

1

まず、最後のバージョン(パラメータ化クエリ)が最も好ましいものでなければなりません型変換と引用が自動的に行われます。そして、あなたはSQL injectionの攻撃から安全です。

今、あなたの質問に答えてください。 あなたは二重引用符の内側に二重引用符を使用する場合は、エスケープする必要がそれら:

cur.execute("INSERT INTO pages (title,content) VALUES (\"test title\", \"test content\")") 

あるいは、内側外側の単一引用符と二重引用符を使用します。あなたが連結することはできません。Pythonで

cur.execute('INSERT INTO pages (title,content) VALUES ("test title", "test content")') 
+1

+1 SQLインジェクションレスポンス。 SQLインジェクションが悪夢なので、PythonでSQLインジェクションを防ぐ方法については、[bobby tables](http://bobby-tables.com/python.html)を参照してください。 –

+0

ありがとう、私は今それを得る。 –

1

をこのようにして文字列を作成します。

a = "foo" 
b = "bar" 
"Foo bar" a " baz " b 

これはあなたがしようとしていたものです。代わりに"Foo bar" + a + " baz " + bを実行する必要があります。しかし、あなたが%sを使用している場合、あなたは(Cのprintf関数に基づく)の書式を使用している、あなたは、文字列をフォーマットするためにコンマを使用することができ、このように

a = "foo" 
b = "bar" 
"Foo bar %s baz %s" % (a, b) 
+0

あなたの助けていただきありがとうございます、私は私の問題が表示されます。 –

関連する問題