2011-01-21 9 views
0

私は以下とValueError:int型のための無効なリテラル()ベース10と: 'SOH'

Traceback (most recent call last): 
    File "C:\SS\Problem13\src\database.py", line 23, in <module> 
    sql = """INSERT INTO students (name, student_id, email, school_id, gender, gpa, address) VALUES ('%s','%i','%s','%i','%s','%f','%s')"""%(data[0], int(data[1]),data[2],int(data[3]),data[4],float(data[5]),data[6]) 
ValueError: invalid literal for int() with base 10: 'SOH' 

のSQLiteデータベースに値を挿入しようとすると、私は次のエラーを受け取ったが、私のコードです:

import sqlite3 
import csv 
# Connect to database, if it does not exist, it will create it. 
conn = sqlite3.connect("nopoly.db") 
# Creating table. 
conn.execute("PRAGMA foreign_keys = 1") 
conn.execute("CREATE TABLE schools (id INTEGER PRIMARY KEY, name TEXT NOT NULL, description TEXT NOT NULL, director TEXT NOT NULL, email TEXT NOT NULL)") 
conn.execute("CREATE TABLE students (id INTEGER PRIMARY KEY, name TEXT NOT NULL, student_id INTEGER NOT NULL, email TEXT NOT NULL, school_id INTEGER NOT NULL REFERENCES schools, gender TEXT NOT NULL, gpa FLOAT NOT NULL, address TEXT NOT NULL)") 
# Opening the csv files 
schoolreader = csv.reader(open("files/schools.csv")) 
studentreader = csv.reader(open("files/studentsp13.csv")) 
# Skip the headers 
schoolreader.next() 
studentreader.next() 
# Extract each row and print 
for data in schoolreader: 
    print data 
    sql = """INSERT INTO schools (name, description, director, email) VALUES ('%s','%s','%s','%s')"""%(data[0],data[1],data[2],data[3]) 
    print "DEBUG", sql 
    conn.execute(sql) 
for data in studentreader: 
    print data 
    sql = """INSERT INTO students (name, student_id, email, school_id, gender, gpa, address) VALUES ('%s','%i','%s','%i','%s','%f','%s')"""%(data[0], int(data[1]),data[2],int(data[3]),data[4],float(data[5]),data[6]) 
    print "DEBUG", sql 
    conn.execute(sql) 
# 
conn.commit() 

私はstudentsp13.csvで、学校は文字列としてラベル付けされていることを理解しています。私はそれを "学校"表に対応するように整数にマップする方法を知りたい。

答えて

4

I received the following error when I try to insert values into sqlite database

代わりのクエリにあなたのパラメータを挿入するように書式設定文字列を使用して、あなたはconn.execute()メソッドへのパラメータとして渡す必要があります。これにより、SQLインジェクション攻撃から身を守ることができ、データはデータベースによって適切なタイプとして扱われます。 SQLite python docsは、これを行う方法の詳細と例を示しています。

I understand that in studentsp13.csv, schools are labelled as strings. I wish to know how to map it into integers such that it corresponds to the "schools" table.

あなたは学校テーブルにエントリを挿入しているときは、辞書にSQLiteのことで生成されたIDを記録することができ、その後、あなたの学生のエントリを挿入するために行くとき、再び彼らを見上げます。

schools = {} 
for data in schoolreader: 
    print data 
    sql = """INSERT INTO schools (name, description, director, email) VALUES ('%s','%s','%s','%s')"""%(data[0],data[1],data[2],data[3]) 
    conn.execute(sql) 
    schools[data[0]] = conn.lastrowid 
for data in studentreader: 
    school_id = schools[data[3]] 
    sql = """INSERT INTO students (name, student_id, email, school_id, gender, gpa, address) VALUES ('%s','%i','%s','%i','%s','%f','%s')"""%(data[0], int(data[1]),data[2],school_id,data[4],float(data[5]),data[6]) 
    conn.execute(sql) 
+0

トレースバック(最新の呼び出しの最後):: ファイル "C:\ SS \ Problem13 \のsrc \のdatabase.py"、22行目、 学校[データ[0]これは次のようになります] = conn.lastrowid AttributeError: 'sqlite3.Connection'オブジェクトに 'lastrowid'属性がありません。 –

関連する問題