2016-02-27 158 views
0

我需要一些幫助,我創建了一個帶有列的數據庫,以允許我將字符串列表存儲在數據庫中。現在我想將數據插入到數據庫中,但它只會將數據存儲在按鈕表中,而不是存儲在程序表中。在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 

回答

1

被插入到節目表什麼都沒有?我覺得跟你插入節目表,你將有這樣的行從第一個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(),)) 

或沿着這些線。

+0

非常感謝你,但是當我嘗試這個'cur.execute(「UPDATE programs SET button_id =?」,([ids]))'時,它會更新數據庫中每行的相同數據。我如何更新表中的數據而不用重複,因爲我在循環中使用它們? – Rob

+0

看看答案的底部,我改變它以反映你的評論。主要問題是我認爲更新SQL命令中的'WHERE'子句。 –

+0

我不認爲你明白我想說。請在我的問題的底部看到我已編輯,所以你會看到數據'button_id'已經更新了錯誤的行,它應該已經在每行更新而不會弄亂它。 – Rob