繁体   English   中英

ValueError:以10为底的int()的无效文字:'SOH'

[英]ValueError: invalid literal for int() with base 10: 'SOH'

尝试将值插入sqlite数据库时收到以下错误

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中,学校被标记为字符串。 我想知道如何将其映射为整数,使其对应于“ schools”表。

尝试将值插入sqlite数据库时收到以下错误

不应使用字符串格式将参数插入查询中,而应将它们作为参数传递给conn.execute()方法。 这样,您可以保护自己免受SQL注入攻击,并且数据库将数据视为正确的类型。 SQLite python文档提供了有关如何执行此操作的详细信息和示例。

我了解到,在studentsp13.csv中,学校被标记为字符串。 我想知道如何将其映射为整数,使其对应于“ schools”表。

将条目插入学校表时,可以将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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM