2

私はこれに何時間も苦労していて、何が起こっているのか理解できないので、今は泣きたい気がします。

これが私のデータの簡略版です:

mydata = [ { 'id': 123, 'thing': 'ghi', 'value': 1 }, { 'id': 456, 'thing': 'xyz', 'value': 0 } ]

これは私が持っているコードです:

import MySQLdb as mdb

con = None
con = mdb.connect('localhost', 'testing', 'anothervalue', 'andanother');
cur = con.cursor()

sql = "INSERT INTO `tablename` ( `id`, `thing`, `value` ) VALUES ( %(id)s, %(thing)s, %(value)s )"
cur.executemany( sql, ( mine for mine in mydata ) )
con.close()

私が予想したことは、2行がtablenameに挿入されることでした。実際に発生するのは、スクリプトがエラーなしで実行され、行が挿入されないことです。

私は何が間違っているのですか?手動で単一のINSERTを実行すると、テーブルに適切に挿入されるため、MySQLデータベースの問題ではなく、データベースに変数を渡す方法がわかっていると思います。

私が持っている追加の質問は、をフロートとして挿入する方法です。現時点では、テーブルにTINYTEXT NOT NULLとして値の定義があります。これを、 FLOAT NOT NULLにしたいと思いますが、上記の置換を処理する方法がわかりません。

4

3 に答える 3

6

ループするためにジェネレーターを使用する必要はありませんmydatamydata直接渡すだけです:

cur.executemany(sql, mydata)

データベースアダプタがループしmydata、ジェネレータ式は不要な余分なループを挿入するだけです。

エラーメッセージが表示されないが変更もない場合は、以下を確認してください。

  • 必ずトランザクションをコミットしてください。con.commit()呼び出しの後に実行し.executemany()ます。

  • トリプル-mydata空でないことを確認します。

データベースアダプタはfloat値を正しく処理します。列がとしてマークされていFLOAT NOT NULLて、その列にPython float値を渡すと、ThingsJustWorkになります。これがSQLパラメータの目的であり、さまざまなデータ型の引用を正しく処理します。

于 2013-02-06T14:18:14.043 に答える
2

デフォルトでは、自動コミットはMYSQLで有効になっています。セットアップの現在の構成を確認するには、MYSQLインスタンスに接続して、以下を実行してください。

mysql> select @@autocommit;    
+--------------+    
| @@autocommit |    
+--------------+    
|            1 |    
+--------------+
1 row in set (0.00 sec)

値が1の場合、有効になります...それ以外の場合は有効になります...。

正直なところ、元のスニペットは私にとっては問題なく機能します。したがって、これは主に自動コミットの問題である可能性があります。

con.close()元のコードの直前に次の行を追加してみてください。

con.commit()

自動コミットが有効になっている場合でも、以下に投稿されている私のスニペットを試してみることができます... mydataリストのメンバーを辞書からタプルタイプに変更できますか?はいの場合は、次のスニペットが役立つかどうかを確認してください。

import MySQLdb as mdb

mydata = [ { 'id': 123, 'thing': 'ghi', 'value': 1 }, { 'id': 456, 'thing': 'xyz', 'value': 0 } ]
mydata_modified=[ (123, 'ghi', 1 ), ( 456, 'xyz', 0 ) ]

con = None
con = mdb.connect('localhost', 'testing', 'anothervalue', 'andanother');
cur = con.cursor()

cur.executemany( """INSERT INTO tablename ( id, thing, value ) VALUES ( %s, %s, %s )""", mydata_modified )
con.commit()
con.close()
于 2013-02-06T15:22:15.020 に答える
0

Gudduを拡張するための参考までに、次のようにして辞書をタプルタイプに変換できます。

mydata_modified = []
for x in mydata:
   mydata_modified.append(tuple(x.values()))
于 2016-01-04T18:15:34.013 に答える