2

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)。データベースはそれを問題なく受け入れます。productsPython を介して静的な値でテーブルを更新することもできますが、動的な値ではできません。

4

1 に答える 1