2011-01-21 97 views
0

我收到以下错误,当我尝试插入值到SQLite数据库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' 

下面是我的代码:

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' – 2011-01-21 06:29:49

相关问题