在sqlite3数据库中插入数据
问题描述:
我需要一些帮助,我创建了一个带有列的数据库,以允许我将字符串列表存储在数据库中。现在我想将数据插入到数据库中,但它只会将数据存储在按钮表中,而不是存储在程序表中。在sqlite3数据库中插入数据
当我试试这个:
cur = con.cursor()
cur.execute('CREATE TABLE programs(channel TEXT, title TEXT, start_date TIMESTAMP, stop_date TIMESTAMP, button_id TEXT, description TEXT)')
con.commit()
for program in channel.findall('programme'):
cur.execute("INSERT INTO programs(channel, title, start_date, stop_date)" + " VALUES(?, ?, ?, ?)", [channel_name, title, start_time, stop_time])
programs_id = list()
for elem in program_button:
programs_id.append(elem.getId())
programs_id = map(str, programs_id)
#store the id and width of buttons in a database
for ids, width in zip(programs_id, program_width):
cur.execute("INSERT INTO buttons(button_ids, button_width)" + " VALUES(?, ?)", [ids, width])
cur.execute("INSERT INTO programs(button_id)" + " VALUES(?)", [ids])
con.commit()
cur.close()
我要插入的数据ids
在节目表中的列button_id
,但是当我尝试它什么事都没有发生。
你能帮我解释一下如何在程序表中插入数据吗?
编辑:当我尝试这样:
for ids, width in zip(programs_id, program_width):
cur.execute("UPDATE programs SET button_id = ? WHERE title=?", ([ids, title]))
这将存储在错误的行中的数据。
#yields:
#channel | title | start_date | stop_date | button_id | description
###########################################################################
#BBC One | Tomorrow's Food | '2015-01-01'|'2016-01-01'| 3003 | blank
#BBC One | BBC News at Ten | '2015-01-01'|'2016-01-01'| 3056 | blank
#BBC One | South E Today | '2015-01-01'|'2016-01-01'| 3125 | blank
#BBC One | A Question of S | '2015-01-01'|'2016-01-01'| 3006 | blank
#BBC One | Film 2016 | '2015-01-01'|'2016-01-01'| 3007 | blank
它应该是这样的:
#yields:
#channel | title | start_date | stop_date | button_id | description
###########################################################################
#BBC One | Tomorrow's Food | '2015-01-01'|'2016-01-01'| 3003 | blank
#BBC One | BBC News at Ten | '2015-01-01'|'2016-01-01'| 3004 | blank
#BBC One | South E Today | '2015-01-01'|'2016-01-01'| 3005 | blank
#BBC One | A Question of S | '2015-01-01'|'2016-01-01'| 3006 | blank
#BBC One | Film 2016 | '2015-01-01'|'2016-01-01'| 3007 | blank
答
被插入到节目表什么都没有?我觉得跟你插入节目表,你将有这样的行从第一个for循环的电流方式:
channel | title | start_date | stop_date | button_id | description
###########################################################################
chanel1 | title1 | start1 | stop1 | blank | blank
而且从你的第二个循环中,您将有一个这样的行:
channel | title | start_date | stop_date | button_id | description
###########################################################################
blank | blank | blank | blank | id1 | blank
我想你可能需要插入button_id和渠道信息等在同一个SQL语句是这样的:
cur.execute("INSERT INTO programs(channel, title, start_date, stop_date, button_id)" +
" VALUES(?, ?, ?, ?)", [channel_name, title, start_time, stop_time, button_id])
或者你可以更新在这样的更新语句中的字段你的第二个循环:
cur.execute("UPDATE programs SET button_id = ? WHERE title=?",
(button_id, title,))
当标题(或其他字段)是你的表的主键,或者先插入button_id并完成此更新语句:
cur.execute("UPDATE programs SET channel=?, title=?, start_date=?, end_date = ? WHERE button_id = ?",
(channel, title, start_date, end_date, button_id,))
拓展上一个例子你的评论:
channel_name = 'PBS'
title = 'planet earth'
start_date = '2015-01-01'
end_date = '2016-01-01'
cur.execute("INSERT INTO programs(channel, title, start_date, stop_date)" +
" VALUES(?, ?, ?, ?)", [channel_name, title, start_time, stop_time])
#yields:
#channel | title | start_date | stop_date | button_id | description
###########################################################################
#PBS | planet earth | '2015-01-01'|'2016-01-01'| blank | blank
button_id = '1'
title = 'planet earth'
cur.execute("UPDATE programs SET button_id = ? WHERE title=?",
(button_id, title,))
#yields:
#channel | title | start_date | stop_date | button_id | description
###########################################################################
#PBS | planet earth | '2015-01-01'|'2016-01-01'| '1' | blank
我认为现在的问题是你没有使用与你的程序链接的button_ids。也许使用program.getChannel等工作,以便您可以同时插入button_id。否则从代码发布我不知道如何'链接'您的程序到按钮ID。 program_button中的elem是否有获取频道或获取标题属性?如果是这样,上面可以改变为:
cur.execute("UPDATE programs SET button_id = ? WHERE title=?",
(button_id, elem.getTitle(),))
或沿着这些线。
非常感谢你,但是当我尝试这个'cur.execute(“UPDATE programs SET button_id =?”,([ids]))'时,它会更新数据库中每行的相同数据。我如何更新表中的数据而不用重复,因为我在循环中使用它们? – Rob
看看答案的底部,我改变它以反映你的评论。主要问题是我认为更新SQL命令中的'WHERE'子句。 –
我不认为你明白我想说。请在我的问题的底部看到我已编辑,所以你会看到数据'button_id'已经更新了错误的行,它应该已经在每行更新而不会弄乱它。 – Rob