2009-06-23 2 views
3

Я не могу найти свою ошибку в следующем коде. При запуске тип ошибки определяется по линии: cur.executemany (SQL% itr.next()) => 'функция принимает ровно 2 аргумента (1 дано),Проблема с SQLite executemany

import sqlite3 
con = sqlite3.connect('test.sqlite') 
cur = con.cursor() 
cur.execute("create table IF NOT EXISTS fred (dat)") 

def newSave(className, fields, objData): 
    sets = [] 
    itr = iter(objData) 
    if len(fields) == 1: 
     sets.append(':' + fields[0]) 
    else: 
     for name in fields: 
      sets.append(':' + name) 
    if len(sets)== 1: 
     colNames = sets[0] 
    else: 
     colNames = ', '.join(sets) 
    sql = " '''insert into %s (%s) values(%%s)'''," % (className, colNames) 
    print itr.next() 
    cur.executemany(sql % itr.next()) 
    con.commit() 

if __name__=='__main__': 
    newSave('fred', ['dat'], [{'dat':1}, {'dat':2}, { 'dat':3}, {'dat':4}]) 

Я оцените свои мысли.

+5

Видя это название, сбивайте меня с ума. Название должно оцифровать фактический вопрос. –

ответ

2

См. the sqlite3 documentation. Как вы увидите, метод Cursor.executemany ожидает два параметра. Возможно, вы приняли его за метод Connection.executemany, который занимает только один?

0

Возможно, вы имели в виду:

cur.executemany (SQL, ITR)

также отметить, что оператор печати потребляет один элемент из итератора.

3

Как говорится, executemany принимает два аргумента. Вместо того, чтобы интерполировать значения строк самостоятельно с помощью%, вы должны передать как sql, так и значения, и пусть адаптер db цитирует их.

sql = " '''insert into %s (%s) values(%%s)'''," % (className, colNames) 
cur.executemany(sql, itr.next()) 
+8

это правильно, кроме интерполяции в sql использует? символ, а не%, поэтому исходная строка sql должна быть «вставлять в значения% s (% s)» (?) «% (className, colNames) – ozan

2

Благодарим всех вас за ответы. После нажатия и выталкивания в течение нескольких дней и используя ваше руководство, следующие работы. Я виноват в том, что переосмыслил свою проблему. Не требуется преобразование iter(). Переменная objData - это список и уже итерабельный! Это была одна из причин, по которой код не работал.

import sqlite3 
con = sqlite3.connect('test.sqlite') 
cur = con.cursor() 
cur.execute("create table IF NOT EXISTS fred (dat, tad)") 

def newSave(className, fields, objData): 
    colSets = [] 
    valSets = [] 
    If len(fields) == 1: 
     colSets.append(fields[0]) 
     valSets.append(':' + fields[0]) 
    else: 
     for name in fields: 
      colSets.append(name) 
      valSets.append(':' + name) 
    if len(colSets)== 1: 
     colNames = colSets[0] 
     vals = valSets[0] 
    else: 
     colNames = ', '.join(colSets) 
     vals = ', '.join(valSets) 
    sql = "insert into %s (%s) values(%s)" % (className, colNames, vals) 
    cur.executemany(sql , objDat) 
    con.commit() 

if __name__=='__main__': 
    newSave('fred', ['dat', 'tad'], [{'dat': 100, 'tad' : 42}, {'dat': 200 , 'tad' : 43}, {'dat': 3 , 'tad' : 44}, {'dat': 4 , 'tad' : 45} ])