2016-12-01 105 views
0

哇,这是非常困难的,只是删除sqlite列,我一直在尝试20件事情在过去的2天现在。sqlite3 Python删除列

目前我有一些代码不会给我一个错误(欢呼!),但它也不会给我任何结果。

我工作的SQL:常见问题解答思路 - http://www.sqlite.org/faq.html#q11但我坚持我的代码在没有错误的情况下运行,但是当我使用数据库浏览器打开数据库时,新表只包含我复制的标题,但不是数据。

下面是代码:

backup = "backup" 
    c.execute("CREATE TABLE IF NOT EXISTS {bu} (id INTEGER PRIMARY KEY AUTOINCREMENT, headline TEXT, datestamp TEXT, link TEXT)".format(bu=backup)) 
    c.execute("INSERT INTO {dt} SELECT {id}, {hl}, {ds}, {lk} FROM {on}".format(dt=backup, id="id", hl="headline", ds="datestamp", lk="link", on=old_table)) 

就像我说的,它运行,但在新表中没有数据,仅列的标题。

除了沮丧,任何帮助将不胜感激

+0

不要在SQL语句上使用字符串格式!有关详细信息,请参见https://docs.python.org/2/library/sqlite3.html。 –

+0

@KlausD。表/列名称不能被参数化。 –

+2

您链接到的FAQ条目使用两个以上的语句。 –

回答

0

在这里您的代码段有可能出现按照您收到的意见,得到的信息在数据库中,以“显示”的一些其他可能的问题具体而言,您需要完成交易。

backup = "backup" 
c.execute("CREATE TABLE IF NOT EXISTS {bu} (id INTEGER PRIMARY KEY AUTOINCREMENT, headline TEXT, datestamp TEXT, link TEXT)".format(bu=backup)) 
c.execute("INSERT INTO {dt} SELECT {id}, {hl}, {ds}, {lk} FROM {on}".format(dt=backup, id="id", hl="headline", ds="datestamp", lk="link", on=old_table)) 
conn.commit() 

否则,当你离开的这些变量(可能是你的脚本结束)的交易将回滚由sqlite3的做下来的眼泪的一部分“范围”。

+0

谢谢史蒂夫,我之前在链接显示时尝试了提交,但最终给我一个错误。然后在Klaus提供的链接上我看到他们使用了conn.commit(),这正是我所需要的。 (我知道你没有看到代码的其余部分,所以你可能会早些时候说过)。但是,感谢您不仅仅发表评论,而且实际上还有一些代码需要注意。 –

+0

我会继续为后代更新我的答案。感谢您的反馈!一些库的游标提交作为只调用连接提交的语法糖。有些不。最好是明确的案件。 –

+0

当你不知道有多少列时,你是否可以使用这种方法?现在我知道有一个“标识”,“标题”,“日期戳”,“链接”列,所以我可以专门调用它们,但如果只知道要删除的列,而不是所有其他列。如何将这些名称放在.format(etc)中? –