0

JSON から解析したデータをデータベースに入力しています。INSERTステートメントを実行すると、エラーが発生します: sqlite3.OperationalError: no such column: None。一部の JSON データは を返しますnull。これにより、Python がNoneテーブルに挿入されますが、これで問題ないと思いますか? 誰が問題が何であるか知っていますか?

トレースバック: Traceback (most recent call last): File "productInfoScraper.py", line 71, in <module> ")")

Python での私のINSERTステートメント:

cursor.execute("INSERT INTO ProductInfo VALUES(" +
        str(data["data"]["product_id"]) + ", " +
        "'" + str(data["data"]["product_name"]) + "'" + ", " +
        "'" + str(data["data"]["ingredients"]) + "'" + ", " +
        "'" + str(data["data"]["serving_size"]) + "'" + ", " +
        str(data["data"]["calories"]) + ", " +
        str(data["data"]["total_fat_g"]) + ", " +
        str(data["data"]["total_fat_percent"]) + ", " +
        str(data["data"]["fat_saturated_g"]) + ", " +
        str(data["data"]["fat_saturated_percent"]) + ", " +
        str(data["data"]["fat_trans_g"]) + ", " +
        str(data["data"]["fat_trans_percent"]) + ", " +
        str(data["data"]["cholesterol_mg"]) + ", " +
        str(data["data"]["sodium_mg"]) + ", " +
        str(data["data"]["sodium_percent"]) + ", " +
        str(data["data"]["carbo_g"]) + ", " +
        str(data["data"]["carbo_percent"]) + ", " +
        str(data["data"]["carbo_fibre_g"]) + ", " +
        str(data["data"]["carbo_fibre_percent"]) + ", " +
        str(data["data"]["carbo_sugars_g"]) + ", " +
        str(data["data"]["protein_g"]) + ", " +
        str(data["data"]["vitamin_a_percent"]) + ", " +
        str(data["data"]["vitamin_c_percent"]) + ", " +
        str(data["data"]["calcium_percent"]) + ", " +
        str(data["data"]["iron_percent"]) + ", " +
        "'" + str(data["data"]["micro_nutrients"]) + "'" +  ", " +
        "'" + str(data["data"]["tips"]) + "'" + ", " +
        str(data["data"]["diet_id"]) + ", " +
        "'" + str(data["data"]["diet_type"]) + "'" +
        ")")

私のCREATE TABLE声明:

cursor.execute("CREATE TABLE ProductInfo(product_id INT, product_name TEXT,\
  ingredients TEXT, serving_size TEXT, calories INT, total_fat_g INT,\
  total_fat_percent INT, fat_saturated_g INT, fat_saturated_percent INT,\
  fat_trans_g INT, fat_trans_percent INT, cholesterol_mg INT, sodium_mg\
  INT, sodium_percent INT, carbo_g INT, carbo_percent INT, carbo_fibre_g\
  INT, carbo_fibre_percent INT, carbo_sugars_g INT, protein_g INT,\
  vitamin_a_percent INT, vitamin_c_percent INT, calcium_percent INT,\
  iron_percent INT, micro_nutrients TEXT, tips TEXT, diet_id INT, diet_type\
  TEXT)")
4

1 に答える 1

2

まず、この方法で SQL ステートメントを作成しないでください。ドキュメントが明示的に言うように:

通常、SQL 操作では Python 変数の値を使用する必要があります。安全ではないため、Python の文字列操作を使用してクエリを組み立てるべきではありません。これにより、プログラムが SQL インジェクション攻撃に対して脆弱になります (問題が発生する可能性のあるユーモラスな例については、http: //xkcd.com/327/を参照してください)。

代わりに、DB-API のパラメーター置換を使用してください。

また、セキュリティの問題以外にも問題があります。引用と変換を正しく行うのは難しく、どこかで単純な間違いを犯しやすく、そのような間違いを犯したときにデバッグするのは非常に困難です。

これを行う正しい方法は、各キーに名前付きのプレースホルダーを使用しdata["data"]、パラメーター マッピングとしてあなたを渡すことです。

cursor.execute("""INSERT INTO ProductInfo VALUES(
    :product_id, 
    :product_name,
    ...
    :diet_type)""", data["data"])

テストするのに十分なサンプル コードとデータがなくても問題が解決するかどうかはわかりませんが、多くの潜在的なエラーの原因が排除されるため、問題が解決する可能性が高いと思います。

最も可能性の高い問題は、挿入しようとしていて引用符で囲まれていない値の 1 つがstr(data["data"]["sodium_mg"])Python のNone値であることです。

引用符Noneなしを SQL ステートメントに入れるだけで、「None」という名前の列の値をこの列にコピーしたいということになります。null 値や文字列 "None" などを使用する場合は、適切に記述する必要があります。

パラメーター バインディングは、null 値を挿入することで自動的に処理します。

しかし、これは私が「引用と変換を正しく行うのが難しい」という意味の一例に過ぎないので、あなたが見ているものとまったく同じかどうかはわかりません.

于 2013-08-28T20:46:13.367 に答える