2016-10-05 2 views
0

私はPythonでmySQLを使用していないので、あらかじめ用意されたSQL INSERT文を実行しようとすると、プレースホルダー付きPythonのSQLエラー1054「フィールドリストの未知の列」xxxxx

通常の解決策は、バックティックの代わりに引用符を追加することです。挿入された値が見つからない場合は引用符を追加することですが、私はチェックを実行していますcolsとvalsのタプルと私は彼らが単一引用符の中に含まれていることを見ることができるので、私はこのエラーがなぜ発生するのか困惑します。

以下

は、私のコードの抜粋です:

for item in cols: 
    try: 
     # First add columns if not already present 
     query = "ALTER TABLE Parameters ADD COLUMN %s VARCHAR(200)" % (str(item)) 

     cursor.execute(query) 
     connection.commit() 
    except: 
     pass 
:(ちなみに「colsの」と「ヴァルスは、」私は、列名を追加する最初の文字列:)に重点を置いて、文字列のタプル()

です

は、それから私は、値を追加してみてください:

sql = "INSERT INTO Parameters ({0}) VALUES ({1})".format(', '.join(cols), ', '.join(['%s'] * len(cols))); 
    try: 
     cursor.execute(sql, vals) 

    except Exception as e: 
     print(e) 

    connection.close() 

は時々問題はありませんが、そうでない場合、私はこのエラーを取得する:

(1054, "Unknown column 'ColumnName' in 'field list'") 

私のPython文は完全に間違っていますか?プレースホルダはベストプラクティスではありませんか?私はリストが非常に大きいのでプレースホルダを使います。

ここでは、SQL文printのダンプされたバージョンです。

INSERT INTO Parameters (TestID, Dev_Type, Version, MAC, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, DayActNxtDateTime, XXXX) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) 

とエラー:

(1054, "Unknown column 'DayActNxtDateTime' in 'field list'") 
+0

変数置換を実行した後にSQLステートメントを出力します。答えが明白でない場合は、その結果を質問に入れます。 –

+0

フィールド名にプレースホルダを使用することはできません。 –

+0

こんにちは@Gordon Linoff、私は実際にそれが機密データであるとしてステートメントを通過することはできませんが、私はこれですでにチェックを実行しています。私は、印刷後のステートメントの例を貼り付けます。 – MikG

答えて

0

はあなたがトラブルに問題を撃つ方法を求めているようですか?

INSERT INTO Parameters ({0}) VALUES ({1}) 

エラーあなたの({0})に、あなたは「ColumnNameに」と呼ばれる一つのフィールドを持っていますが、それはあなたのテーブルのパラメータで定義されていないことを報告。

試してみてください。

SHOW CREATE TABLE parameters; 

そして、あなたのテーブルには、フィールドが含まれていることを確認してください。まだ問題がある場合は

、その後、あなたの例外ハンドラ内のすべてのSQLをプリントアウト:

print(e) 
print(sql) 

は、その後、私はどのライブラリで確認してくださいSQL文字列が誤って台無しにされていないを作るためのtcpdumpを実行します

sudo tcpdump -A -i lo0 dst port 3306 

スクリプトを実行します。

0

ご協力ありがとうございました@Gordon Linoffと@Shuo。 SQLステートメントのダンプされたバージョンが間違っていたことが判明しました。私は答えを見つけるためにSQLコマンドラインを使って手動で列を直接追加して遊びました。

私の列名の中には、SQLによって課せられた64文字の制限(これらの列名はプログラムによって生成される)を超えていることが判明しました。 SQLでカラムのタイトルを短縮する方法があるかどうか分かりませんが、一見してCOMPRESSメソッドについて何かを見ましたか?

私はPython辞書を作成して、これらの余分な長い列名を作成時に作成し、手動で作成した代替値にマップしましたが、今のところはそうです。私に指示を与えてくれてありがとう。

関連する問題