1

テーブルを次のように定義したMySQL DBにレコードを書き込もうとしていますjobs:

CREATE TABLE jobs(
   job_id INT NOT NULL AUTO_INCREMENT,
   job_title VARCHAR(300) NOT NULL,
   job_url VARCHAR(400) NOT NULL,
   job_location VARCHAR(150),
   job_salary_low DECIMAL(25) DEFAULT(0),
   job_salary_high DECIMAL(25), DEFAULT(0),
   company VARCHAR(150),
   job_posted DATE,
   PRIMARY KEY ( job_id )
);

私がテストしているコードは次のとおりです。

cur.execute("INSERT INTO jobs VALUES(DEFAULT, '"+jobTitle+"','"
    +jobHref+"',"+salaryLow+","+salaryHigh+",'"+company+"',"
    +jobPostedAdjusted+"','"+salaryCurrency+"';")
print(cur.fetchall())

私が得ているエラーは次のとおりです。

pydev debugger: starting
Traceback (most recent call last):
  File "C:\Users\Me\AppData\Local\Aptana Studio 3\plugins\org.python.pydev_2.7.0.2013032300\pysrc\pydevd.py", line 1397, in <module>
    debugger.run(setup['file'], None, None)
  File "C:\Users\Me\AppData\Local\Aptana Studio 3\plugins\org.python.pydev_2.7.0.2013032300\pysrc\pydevd.py", line 1090, in run
    pydev_imports.execfile(file, globals, locals) #execute the script
  File "C:\Users\Me\Documents\Aptana Studio 3 Workspace\PythonScripts\PythonScripts\testFind.py", line 25, in <module>
    +jobPostedAdjusted+"','"+salaryCurrency+"';")
TypeError: cannot concatenate 'str' and 'float' objects

このレコードを挿入する最良の方法は何ですか? ありがとう。

4

3 に答える 3

2

このレコードを挿入する最良の方法は何ですか?

プレースホルダーを使用%sし、パラメーターを別のリストとして渡し、MySQLdbすべてのパラメーター補間を行います。

例えば...

params = [jobTitle,
          jobHref,
          salaryLow,
          salaryHigh,
          company,
          jobPostedAdjusted,
          salaryCurrency]
cur.execute("INSERT INTO jobs VALUES(DEFAULT, %s, %s, %s, %s, %s, %s, %s)", params)

これにより、SQL インジェクションからも保護されます。


アップデート

コードが実行されると、 のような空の括弧が出力されprint(cur.fetchall())ます。cur.execute....()

INSERTクエリは結果セットを返さないためcur.fetchall()、空のリストを返します。

端末から DB に問い合わせると、何も変更されていないことがわかります。

InnoDB のようなトランザクション ストレージ エンジンを使用している場合は、次のようなトランザクションを明示的にコミットしています...

conn = MySQLdb.connect(...)
cur = conn.cursor()
cur.execute("INSERT ...")
conn.commit()

多くの行が必要な場合INSERTは、単一のトランザクションで行う方がはるかに高速です...

conn = MySQLdb.connect(...)
cur = conn.cursor()
for i in range(100):
    cur.execute("INSERT ...")
conn.commit()

... InnoDB (デフォルト) は、 を呼び出すたびにデータをディスクに同期するためconn.commit()です。

また、commit;ステートメントはどこかにある必要がありますか?

このcommitステートメントは、サーバーではなく MySQL クライアントによって解釈されるため、 で使用することはできませんが、最終的には前の例MySQLdbの行と同じことを行います。conn.commit()

于 2013-06-12T17:44:29.933 に答える
0

エラーメッセージはそれをすべて言います:

TypeError:「str」オブジェクトと「float」オブジェクトを連結できません

Python は float を文字列に自動的に変換しません。あなたの親友はここにいるかもしれませformat

>>> "INSERT INTO jobs VALUES(DEFAULT, '{}', '{}')".format("Programmer", 35000.5)
"INSERT INTO jobs VALUES(DEFAULT, 'Programmer', '35000.5')"

ただし、何の予防措置も講じずにユーザー提供のデータを SQL 文字列に挿入すると、 SQL インジェクションが発生する可能性があることに注意してください。注意してください...そのexecuteため、独自の方法を提供し、そのリスクからあなたを守ります。そんな感じ:

>>> cursor.execute("INSERT INTO jobs VALUES(DEFAULT, '%s', '%f', "Programmer", 35000.5)

これに関する完全な議論については、Web を検索してください。たとえばhttp://love-python.blogspot.fr/2010/08/prevent-sql-injection-in-python-using.html


ところで、float 型は主に科学計算用です。ただし、丸め誤差のため、通常は金銭的価値には適していません(そのため、テーブルではDECIMAL列を使用しますが、列は使用しないと思いますFLOAT)。正確な値については、Python がdecimal型を提供します。あなたはそれを見てみるべきです。

于 2013-06-12T17:39:58.033 に答える
0

したいときにA1、のように連結することはできません'A' + 1。Sylvainがちょうど口を開いたように、format動作します:

'A{}'.format(1)

ただし、この場合、execute メソッドは、この一般的な問題を処理する独自の方法を提供します。

execute('A%s', (1))

より完全な例については、ドキュメントを参照してください。

于 2013-06-12T17:43:12.017 に答える