Python: строка вставки SQLite

avatar
Anonymousy
8 апреля 2018 в 05:05
803
3
0

У меня более 100 строк данных, и было бы очень неудобно иметь строку для вставки таблицы для каждой строки. Поэтому я пытаюсь как-то ускорить вставку строк в мою базу данных sqlite. Итак, я придумал следующее:

def insert_item(obj):
    with db:
        c.execute("INSERT INTO Database VALUES (\
                   :First, :Last, :Item1, :Item2)",
                  {'First': obj.First,
                   'Last': obj.Last,
                   'Item1': obj.Item1,
                   'Item2': obj.Item2})

obj_1 = ('John', 'Doe', 4, 5)
obj_2 = ('Jane', 'Doe', 6, 8)
...
obj_106 = ('Johnathan', 'Doe', 9, 1)

d = {}
for x in range(1, 107):
    row = (d["obj_{0}".format(x)])
    insert_item(row)

Однако он вернулся с этой ошибкой:

 row = (d["obj_{0}".format(x)])
KeyError: 'obj_1'

Не знаю, что пошло не так, строка возвращает нужное значение, но функция не работает.

Спасибо

Источник
rwp
8 апреля 2018 в 05:09
0

Разве словарь d не пуст в том месте вашего кода, где вы пытаетесь найти «obj_1»?

Ответы (3)

avatar
Anonymousy
8 апреля 2018 в 08:23
0

Я нашел способ пройти INSERT INTO с помощью locals()

 def insert_item(obj):
    with db:
        c.execute("INSERT INTO Database VALUES (\
                   :First, :Last, :Item1, :Item2)",
                  {'First': obj.First,
                   'Last': obj.Last,
                   'Item1': obj.Item1,
                   'Item2': obj.Item2})

obj_1 = ('John', 'Doe', 4, 5)
obj_2 = ('Jane', 'Doe', 6, 8)
...
obj_106 = ('Johnathan', 'Doe', 9, 1)

for num in range(1, 107):
        row = locals()["obj_" + str(num)]
        insert_item(row)

Это работает отлично, просто вам нужно вручную ввести диапазон.

avatar
Shubhitgarg
8 апреля 2018 в 07:39
1

Используйте executemany для объемных вставок. Вставьте все объекты как tuples в list например.

My_list = [('John', 'Doe', 4, 5),('Jane', 'Doe', 6, 8).....]

c.executemany("INSERT INTO Database ('First,'Last','item1,'item2') VALUES (? ? ? ?)",(My_list)) 
avatar
Alan Hoover
8 апреля 2018 в 05:47
1

Вы определяете набор кортежей, затем пустой dict, затем пытаетесь получить доступ к значению в упомянутом пустом dict. Что вы хотите сделать, так это загрузить эти кортежи в этот dict (или list), чтобы начать.

d={obj_1 : ('John', 'Doe', 4, 5),
   obj_2 : ('Jane', 'Doe', 6, 8),
   ...
   obj_106 : ('Johnathan', 'Doe', 9, 1)}

for x in range(1, 107):
    row = (d["obj_{0}".format(x)])
    insert_item(row)

Или, даже лучше

d = [('John', 'Doe', 4, 5),
     ('Jane', 'Doe', 6, 8),
      ...
     ('Johnathan', 'Doe', 9, 1)]

for row in d:
    insert_item(row)

Вы действительно должны прочитать о том, как использовать dict