1

OperationalError: (1054、「フィールド リスト」の不明な列「エリー」) という問題が発生しています。以下のコードを使用して、json から my sql データベースにデータを挿入しようとしています。この場合、「Ellie」という文字列を挿入しようとするたびに問題が発生します。

テーブルを作成

con = MySQLdb.connect('localhost','root','','tweetsdb01')
cursor = con.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS User(user_id BIGINT NOT NULL PRIMARY KEY, username varchar(25) NOT NULL,user varchar(25) NOT NULL) CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB")
con.commit() 

に挿入

def populate_user(a,b,c):
    con = MySQLdb.connect('localhost','root','','tweetsdb01')
    cursor = con.cursor()
    cursor.execute("INSERT INTO User(user_id,username,user) VALUES(%s,%s,%s)"%(a,b,c))
    con.commit() 
    cursor.close() 

READ FILE - 上記の populate メソッドを呼び出します

def read(file):
    json_data=open(file)
    tweets = []
    for i in range(10):
        tweet = json.loads(json_data.readline())

    populate_user(tweet['from_user_id'],tweet['from_user_name'],tweet['from_user'])
4

2 に答える 2

4

パラメータ化された SQL を使用します

cursor.execute("INSERT INTO User(user_id,username,user) VALUES (%s,%s,%s)", (a,b,c))

(値は、文字列補間による最初の引数の一部としてではなく、2 番目の引数として(a,b,c)関数に渡されることに注意してください)。executeMySQLdb は引数を適切に引用します。


PS。Vajk Hermecz が指摘しているように、文字列'Ellie'が適切に引用されていないために問題が発生します。

で文字列補間を行うと、"(%s,)" % (a,)実際 (Ellie,)に必要なのは('Ellie',). しかし、わざわざ自分で引用しないでください。パラメータ化された SQL を使用する方が安全で簡単です。

于 2012-11-14T09:30:42.743 に答える
2

あなたの問題は、エスケープせずに値をクエリに追加していることです....今は壊れています。次のようなことができます。

cursor.execute("INSERT INTO User(user_id,username,user) VALUES(\"%s\",\"%s\",\"%s\")"%(a,b,c))

しかし、それはコードに SQL INJECTION を導入するだけです。

クエリとデータを連結して SQL ステートメントを作成しないでください。パラメータ化されたクエリ...

ここでの適切な解決策は次のとおりです。

cursor.execute("INSERT INTO User(user_id,username,user) VALUES(%s,%s,%s)", (a,b,c))

したがって、コードの問題は、%文字列の書式設定を行う演算子を使用し、最後に に 1 つのパラメーターを指定したことcursor.executeです。適切な解決策は、文字列の書式設定を自分で行う代わりにcursor.execute、最初のパラメーターでクエリ部分を指定し、2 番目のパラメーターでタプルに引数を指定することです。

于 2012-11-14T09:29:23.743 に答える