python sqlite 插入的数据含有变量,结果不一致

代码如下:
def insert():
conn = sqlite3.connect("rocky_sqlite.db")
print "open database passed"
table_create = '''
CREATE TABLE COMPANY
(ID INT PRIMARY KEY,
NAME TEXT,
AGE INT,
ADDRESS CHAR(50),
SALARY REAL
);
'''
conn.execute(table_create)

temp="2017-12-12"
paul="INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES(1,%s,32,'CALIFORNIA',2000.00);"
%temp #这里用python的变量替换

allen="INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES(2,'ALLEN',72,'CALIFORNIA',20500.00);"
teddy="INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES(3,'TEDDY',732,'CALIFORNIA',52000.00);"
mark="INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES(4,'MARK',327,'CALIFORNIA',3000.00);"
conn.execute(paul)
conn.execute(allen)
conn.execute(teddy)
conn.execute(mark)
conn.commit()
conn.close()

 
最终得到的结果是,id=1的name不是2017-12-12,而是一个乱的1996。 
 
为什么
已邀请:

李魔佛 - 左手的厨子

赞同来自:

因为你的temp包含的字符 - ,被转义了。 而且对于sql语句,还少了一个引号“ ”
 
编译器实际解释 的语句是 :
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES(1,2017-12-12,32,'CALIFORNIA',2000.00);
 
而表里定义的是 

table_create = ''' CREATE TABLE COMPANY (ID INT PRIMARY KEY, NAME TEXT, AGE INT, ADDRESS CHAR(50), SALARY REAL ); '''

Name是text类型,现在变成了一个非int,非字符,所以才会出错
 
使用 ?,来替代%s ,或者类似的变量。
 
或者在原来语句添加一个引号。
 
paul="INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES(1,\"%s\",32,'CALIFORNIA',2000.00);" %temp
 
 
 
 

要回复问题请先登录注册