2014-12-29 3 views
1

У меня есть два списка в Python3 для вставки в базу данных SQLite. Следующий код работает, но я уверен, что есть лучший способ.Вставить списки в базу данных SQLite

cur.execute("CREATE TABLE my_table (id INT, vegetables TEXT, fruits TEXT)") 

ls_vegetables = ['artichoke ', 'broccoli', 'celery'] 
ls_fruits = ['apple', 'banana', 'coconut'] 

# Vegetables loop 
id = 1 
for v in ls_vegetables: 
    cur.execute("INSERT INTO my_table(ID, vegetables) VALUES (?,?)", (id,v)) 
    id += 1 
conn.commit() 

# Fruits loop 
id=1 
for f in ls_fruits: 
    cur.execute ("UPDATE my_table SET fruits=? WHERE ID=?", (f,id)) 
    id += 1 
conn.commit() 

Могу ли я иметь только одну петлю?

Это эскиз моего стола:

+----+------------+---------+ 
| id | vegetables | fruits | 
+====+============+=========+ 
| 1 | artichoke | apple | 
+----+------------+---------+ 
| 2 | broccoli | banana | 
+----+------------+---------+ 
| 3 | celery  | coconut | 
+----+------------+---------+ 

ответ

0

Вы можете сделайте все это с помощью одного заявления без какой-либо петли:

cur.executemany("INSERT INTO my_table(ID, vegetables, fruits) VALUES (?,?,?)", 
    ((i, v, f) for (i, (v, f)) in enumerate(zip(vegetables, fruits), 1))) 

Добавлено: отредактировано для увеличения индекса, овощей и фруктов в плоский 3-элементный кортеж по мере необходимости, а не 2-элементный кортеж, чей 2-й арг сам по себе является кортежем).

+0

Ваше решение было бы совершенным, но у меня все еще есть ошибка: 'Текущее заявление использует 3, и есть 2 поставленных'. Это весь код: импорт sqlite3 сопп = sqlite3.connect (": памяти:") дворняжка = conn.cursor() cur.execute ("CREATE TABLE my_table (ID INT, овощи TEXT , фрукты ТЕКСТ) ") ls_vegetables = [ 'артишок', 'брокколи', 'сельдерея'] ls_fruits = [ 'яблоко', 'банан', 'кокосовое'] cur.executemany (" INSERT INTO my_table (ID, овощи, фрукты) VALUES (?,?,?) ", Перечислять (zip (ls_vegetables, ls_fruits), 1)) conn.commit() – isar

+0

Код в комментариях нечитабельный, но это действительно показало мне проблему w/my code - 'enum erate' возвращает 2 вещи (int и 2-элементный кортеж), поэтому они должны быть распакованы - редактирование для этого –

0

Если вы уверены, что длина ls_vegetables и ls_fruits равны вы можете zip их и использовать одну петлю:

cur.execute("CREATE TABLE my_table (id INT, vegetables TEXT, fruits TEXT)") 

ls_vegetables = ['artichoke ', 'broccoli', 'celery'] 
ls_fruits = ['apple', 'banana', 'coconut'] 

# Vegetables loop 
id = 1 
for v,f in zip(ls_vegetables,ls_fruits): 
    cur.execute("INSERT INTO my_table(ID, vegetables) VALUES (?,?)", (id,v)) 
    cur.execute ("UPDATE my_table SET fruits=? WHERE ID=?", (f,id)) 
    id += 1 
conn.commit() 
+0

Почему бы не отказаться от UPDATE и не указать все значения в INSERT? –