Python (3.4) コードがありますが、カーソルがそれをデータベースにコミットしません。MySQL クライアントを介して手動で入力すると、変更をコミットできます (そのためUPDATE
、関連するテーブルに対する権限があることを確認しています)。このコードは、csv ファイルからの情報でテーブルを更新するだけです。
#!/bin/python3.4
import mysql.connector
import csv
import sys
cnx = mysql.connector.connect(user='me', password=sys.argv[1] , host="localhost", database="mydb")
cursor = cnx.cursor()
csvfile = open("products.csv", 'r', newline='')
products = csv.DictReader(csvfile, delimiter = ',', quotechar='"', skipinitialspace=True)
update_product= ("UPDATE products SET "
"ticket_price = %(ticket_price)s, "
"quantity_ordered = %(quantity_ordered)s "
"WHERE product_code = \"%(product_code)s\";"
)
for row in products:
data = {
"product_code":row["product_code"],
"ticket_price":row["ticket_price"],
"quantity_ordered":row["quantity_ordered"]
}
cursor.execute(update_product, data)
print(row["product_code"] + " quantity_ordered: " + row["quantity_ordered"])
# Commit to the database
cnx.commit()
cursor.close()
csvfile.close()
cnx.close()
これは準備されたステートメントであるため、実行された実際の SQL 文字列を取得できるとは思いません (ただし、呼び出すとprint(update_product % data)
、ステートメントがどのように表示されるかを確認できます)。Pythonインタープリターに手動でコピーアンドペーストすることから、SQLは問題ないと思います(cursor.fetchwarnings()
文句はありません)。入力データは良好です。print ステートメントは正しく読み取ります。コミットしないだけです-データベース内のすべての情報は、それらの行に対してゼロのままです。このスクリプトを、機能するほぼ同一のスクリプトと比較しましたが、違いはないようです。私も試しましcnx.autocommit = True
たが、どちらもうまくいきません。
何が問題なのか、またはデバッグできるようにステータスを取得しcursor.execute()
て返す方法を知っている人はいますか? APIは言及していないようで、テストの結果、これらのメソッドは実際には値を返さないと思われます。このため、私は少し目がくらんでいます-メソッドを呼び出して、何かが起こることを祈る必要がありますか?connector.commit()
編集:
フラストレーションから、. を使用して SQL ファイルを生成しましたprint(update_product % data)
。データベースはそれを問題なく受け入れます。products
Python を介して静的な値でテーブルを更新することもできますが、動的な値ではできません。