我正在对我的数据库进行插入,并且我正在插入一个带有电子邮件的字符串。
这样的事情:
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
有人知道发生了什么吗?
答案 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注入安全方式绑定到语句,而无需担心在名称中转义内部引号(例如)。