我正在学习如何在python中使用sqlite3。我有一个包含2列的简单表:ID和名称。
我尝试使用以下命令在此表中添加新列(我在ipython中工作):
conn = sqlite3.connect('mydatabase.db')
c = conn.cursor()
c.execute("alter table studentinfo add column Group integer")
我收到以下错误:
OperationalError: near "Group": syntax error
然后,根据S.O.的例子。我试过了,
c.execute("alter table studentinfo add column 'Group' integer")
这很有用。但是,我现在有另一个问题。显然,列名称是“'Group'”而不仅仅是“Group”。
例如,当我尝试更新此列中的值时,在以下三个命令中,一个工作,两个不工作。
conn = sqlite3.connect('mydatabase.db')
c = conn.cursor()
c.execute("update studentinfo set Group=1 where ID <= 4") #This did not work.
我收到以下错误:
OperationalError: near "Group": syntax error
然后我尝试在列名称周围添加引号:
c.execute("update studentinfo set 'Group'=1 where 'ID' <= 4")
#This did not work either. Gives no error, but does not do anything. Records remain
#unchanged.
然后,我尝试使用Group
周围的引号,但不是ID
周围的引号。这很好。
c.execute("update studentinfo set 'Group'=1 where ID <= 4") #This worked fine.
也就是说,它将列名称视为“组”(带引号)。如何添加名称为Group的列?
谢谢。
答案 0 :(得分:6)
当表名或列名与SQL关键字(例如GROUP)相同时,会生成错误。您需要使用“,而不是”来引用表名。所以你可以使用:
alter table studentinfo add column `Group` integer
答案 1 :(得分:3)
GROUP
是一个SQLite关键字。
解决方案:将您的列命名为其他内容。
答案 2 :(得分:1)
问题在于您执行ALTER TABLE命令的方式。通过在指定的列名称周围包含单引号,该名称是名称的一部分。删除引号,它应该按预期工作。
仅供参考:您可以使用dot-s命令(.s)在sqlite3中查询架构。它会显示真正的列名。这是一个快速的样本:
SQLite version 3.7.9 2011-11-01 00:52:41
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table a( mycol1 INT );
sqlite> alter table a add column mycol2 int;
sqlite> alter table a add column 'mycol3' int;
sqlite> .s
CREATE TABLE a( mycol1 INT , mycol2 int, 'mycol3' int);
sqlite>