2014-09-26 117 views
0

我是新來的sqlite和我認爲這個問題應該已經回答之前,但我還沒有能夠找到答案。 我有一個約50個元素的列表,我需要寫入一個sqlite數據庫與50列。 檢查了文檔@https://docs.python.org/2/library/sqlite3.html,但在示例中,值由? ?(因此對於寫入3個值,3被指定python sqlite:寫一個大列表到sqlite數據庫

示例代碼:

row_to_write = range(50) conn = sqlite3.connect('C:\sample_database\sample_database') c = conn.cursor()

嘗試這些:

方法1

c.execute("INSERT INTO PMU VALUES (?)", row_to_write) ERROR: OperationalError: table PMU has 50 columns but 1 values were supplied

方法2 ......嘗試寫一個生成器迭代列表

def write_row_value_generator(row_to_write): for val in row_to_write: yield (val,) c.executemany("INSERT INTO PMU VALUES (?)", write_row_value_generator(row_to_write)) ERROR: OperationalError: table PMU has 50 columns but 1 values were supplied 這樣做的正確方法是什麼?

+0

請提供證明該錯誤的短,完整的程序以便其他人可能會重現您的問題。 – 2014-09-26 20:19:36

回答

0

假設你row_to_write有相同數量的項目爲PMU有列,你可以很容易地使用str.join創建?馬克的字符串:','.join(['?']*len(row_to_write))

import sqlite3 

conn = sqlite3.connect(':memory:') 
c = conn.cursor() 
c.execute("create table PMU (%s)" % ','.join("col%d"%i for i in range(50))) 

row_to_write = list(range(100,150,1)) 
row_value_markers = ','.join(['?']*len(row_to_write)) 
c.execute("INSERT INTO PMU VALUES (%s)"%row_value_markers, row_to_write) 

conn.commit() 
+0

試過這個並且工作!正是我正在尋找...謝謝一噸 – anna1983 2014-09-26 21:10:05

0

您需要指定列的名稱。 Sqlite不會爲你猜這些。

columns = ['A', 'B', 'C', ...] 
n = len(row_to_write) 
sql = "INSERT INTO PMU {} VALUES ({})".format(
    ', '.join(columns[:n]) , ', '.join(['?']*n)) 

c.execute(sql, row_to_write) 

還要注意,如果您的行具有可變數量的列,那麼您可能需要重新考慮數據庫模式。通常,每行應具有固定數量的列,並且可變性表示插入的行數,而不是使用的列數。

例如,您可能只需要一個額外的列,而不是50列,其值是50個名稱之一(以前是列名稱)。 row_to_write中的每個值都有其自己的行,並且對於每行都會有兩列:值的列和名稱。

+0

「*您需要指定列的名稱*」 - 不完全。如果問號的數量與表中的列數相同,則列名可以省略。參考:http://www.sqlite.org/lang_insert.html – 2014-09-26 20:35:12

+0

@Robᵩ:沒錯,但OP說每行都有「*周圍* 50個元素」。所以這聽起來像'row_to_write'沒有*完全* 50個元素。 – unutbu 2014-09-26 20:41:10

+0

這個評論是非常有幫助的,因爲它把我放在正確的方向 – anna1983 2014-09-26 21:10:46