插入数据库时​​的ValueError

时间:2014-11-12 19:19:56

标签: python sql

我正在对我的数据库进行插入,并且我正在插入一个带有电子邮件的字符串。

这样的事情:

cur.execute("insert into client values(%s,%s,%s,%s)",(name, email, date,int(age)))

然后,当变量email'email@outlook.com'时,Python会抛出此消息

ValueError: invalid literal for int() with base 10: email@outlook.com

我的数据库具有以下元数据:

name = varchar
email = varchar
date = date
age = integer

有人知道发生了什么吗?

2 个答案:

答案 0 :(得分:1)

此错误来自Python,而不是SQL。

不知何故,名称age等于字符串'email@outlook.com'。因此,当您执行int(age)时,您会获得ValueError

>>> age = 'email@outlook.com'
>>> int(age)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'email@outlook.com'
>>>

您需要找到您不小心将age分配到电子邮件地址的位置并进行修复。我不清楚你是怎么做的,因为代码没有发布,但通常是因为你错误地解压缩了一个迭代。类似的东西:

name, email, date, age = ['Joe', 20, '11/12/2014', 'email@outlook.com']

应该是:

name, age, date, email = ['Joe', 20, '11/12/2014', 'email@outlook.com']

此外,您不应该使用字符串格式来构建SQL命令。相反,将参数作为元组传递并使用?来引用它们:

cur.execute("insert into client values(?,?,?,?)", (name, email, date, age))

来自docs

  

通常,您的SQL操作需要使用Python中的值   变量。您不应该使用Python的字符串汇编查询   因为这样做是不安全的;它使你的程序   容易受到SQL注入攻击(请参阅http://xkcd.com/327/)   什么可能出错的幽默例子。)

答案 1 :(得分:0)

永远不要编写像

这样的INSERT语句
 INSERT INTO Client VALUES (?, ?, ?, ?)

改为写

 INSERT INTO Client (Name, EmailAddress, StartDate, Age) VALUES (?, ?, ?, ?)

第一个版本非常脆弱。即使它在您第一次实施程序时有效,但如果您重组表,它会受到破坏 - 破坏可能导致程序失败,或者更糟糕的是,允许它工作但是将数据插入错误的列。 / p>

此外,以这种方式应用SQL语句时,对于传递给语句的参数,使用无类型?占位符。然后,这些参数将以类型敏感的SQL注入安全方式绑定到语句,而无需担心在名称中转义内部引号(例如)。