2010-01-19 4 views
37

У меня есть список, который состоит из 3 строк каждая из которых представляет собой строку таблицы:Python и SQLite: вставить в таблицу

>>> print list 
[laks,444,M] 
[kam,445,M] 
[kam,445,M] 

Как вставить этот список в таблицу?

Моя структура таблицы:

 
tablename(name varchar[100], age int, sex char[1]) 

Или я должен использовать что-то другое, чем список?

Вот фактический код часть:

for record in self.server: 
     print "--->",record 
     t=record 
     self.cursor.execute("insert into server(server) values (?)",(t[0],)); 
     self.cursor.execute("insert into server(id) values (?)",(t[1],)) 
     self.cursor.execute("insert into server(status) values (?)",(t[2],)); 

Установка трех полей отдельно работает, но с использованием одной линии, как

self.cursor.execute("insert into server(server,c_id,status) values (?,?,?)",(t[0],),(t[1],),(t[2],))

или

self.cursor.execute("insert into server(server,c_id,status) values (?,?,?)",(t),)

не.

+1

Теперь он исправлен. Я использовал этот неправильный метод self.cursor.execute ("вставить в значения сервера (сервер, c_id, статус) (?,?,?)", (T [0],), (t [1],) , (t [2],)) Правильный метод - self.cursor.execute ("Вставить в значения сервера (сервер, c_id, статус) (?,?,?)", (t [0], t [ 1], t [2],)) –

ответ

29
conn = sqlite3.connect('/path/to/your/sqlite_file.db') 
c = conn.cursor() 
for item in my_list: 
    c.execute('insert into tablename values (?,?,?)', item) 
+0

Спасибо Dyno и Dominic - Но это не работает - это то, что я пытаюсь ----------- \t для записи в список: \t print "--->", запись \t cursor.execute ("вставить в значения процесса (?,?,?)", записать); ----------- получение ошибки –

+0

@lakshmipathi - Какую ошибку вы получаете? –

+0

У меня есть попытка, за исключением части - попробуйте часть для цикла и выполнить stmt, и кроме того, у части есть одно сообщение с сообщением «insert failed» ... он просто печатает сообщение за исключением части и завершает работу. Как отлаживать это более эффективно? –

8

адаптирован из http://docs.python.org/library/sqlite3.html:

# Larger example 
for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), 
      ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00), 
      ('2006-04-06', 'SELL', 'IBM', 500, 53.00), 
     ]: 
    c.execute('insert into stocks values (?,?,?,?,?)', t) 
62

есть лучший способ

# Larger example 
rows = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), 
     ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00), 
     ('2006-04-06', 'SELL', 'IBM', 500, 53.00)] 
c.executemany('insert into stocks values (?,?,?,?,?)', rows) 
connection.commit() 
+0

У меня есть запрос об этом, потому что я попытался это, но я получаю и ошибаюсь, говоря, что у меня есть 6 столбцов и только предоставленная информация для 5.Это верно, но первый столбец является pk integer, и вам не нужно указывать его значение. Есть ли способ преодолеть это? - – Mike

+0

Выяснил это. Просто добавьте заголовки полей после имени db, как обычно. – Mike

7

Не прямой ответ, но вот функция вставить строку с колонными парами значений Into SQLite стол:

def sqlite_insert(conn, table, row): 
    cols = ', '.join('"{}"'.format(col) for col in row.keys()) 
    vals = ', '.join(':{}'.format(col) for col in row.keys()) 
    sql = 'INSERT INTO "{0}" ({1}) VALUES ({2})'.format(table, cols, vals) 
    conn.cursor().execute(sql, row) 
    conn.commit() 

Пример использования:

sqlite_insert(conn, 'stocks', { 
     'created_at': '2016-04-17', 
     'type': 'BUY', 
     'amount': 500, 
     'price': 45.00}) 

Обратите внимание, что имя таблицы и имена столбцов должны быть проверены заранее.