2017-07-14 93 views
0

我試圖從刮取的文本構建SQLite數據庫。數據庫中的每一行對應於從列表中獲取的字符串,並且對於每個循環創建另一列並使用新的字符串數據填充。SQLite/python - 在while循環內添加數據列

conn = sqlite3.connect('data.sqlite') 
cur = conn.cursor() 

cur.executescript(''' 
DROP TABLE IF EXISTS Data; 
CREATE TABLE Data(
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
words text)''') 

while True 
    url = 'www.xyz.com' 
    if url == "break": break 

#parse - find tag of interest 
    html = urllib.request.urlopen(url) 
    p_s = BeautifulSoup(html,'html.parser') 
    words = str(p_s.findAll('p',{'id':'p-5'})) 
    words = strip_tags(words) 
    words = pd.DataFrame(words) 

    col_number = col_number + 1 
    col_name = ('Group', col_number) 

    cur.execute('''ALTER TABLE Data ADD ? TEXT''', (col_name,)) 
    for i,j in words.iterrows(): 
     cur.execute('''INSERT OR IGNORE INTO Data (col_name) 
     VALUES (?)''',(j)) 
    conn.commit() 

當我運行這段代碼,我得到:

sqlite3.Operational.Error : near "?": syntax error 

我要去哪裏錯了?謝謝,我爲我的草率代碼道歉,我是Python的新手!

+0

添加新的數據作爲欄目是可怕的設計。將「新字符串數據」添加爲新行,而不是新列。使用** 1 **附加列'Group'來保存'col_name'的值。使用結果會容易得多。 – alexis

回答

0

更改爲:

cur.execute('''ALTER TABLE Data ADD {} TEXT'''.format('Group ' + str(col_number))) 
    for i,j in words.iterrows(): 
     cur.execute('''INSERT OR IGNORE INTO Data ({}) 
     VALUES (?)'''.format(col_name), (j,)) 
    conn.commit() 

cur.execute('''ALTER TABLE Data ADD {} TEXT'''.format('Group ' + str(col_number))) 
     for i,j in words.iterrows(): 
      cur.execute('''INSERT OR IGNORE INTO Data {} 
      VALUES (?)'''.format(col_name), (j,)) 
     conn.commit() 

其中之一應該工作

+0

不幸的是,沒有爲我工作。返回錯誤是上線:( '' 'ALTER TABLE數據添加{} TEXT' '' 格式(COL_NAME)) ''cur.execute 和錯誤是: 'sqlite3.Operational.Error :「附近」(「:語法錯誤」) – dooogan

+0

嘗試'cur.execute('''ALTER TABLE Data ADD {} TEXT'''。format('Group'+ col_number))'看看它是否通過第一個 – codyc4321

+0

@ cody將其改爲「Group'+ str(col_number)'或等價物,否則你將'str'添加到'int'。 – alexis