Как мне использовать подготовленные инструкции для вставки НЕСКОЛЬКИХ записей в SQLite с использованием Python / Django?

#python #django #sqlite

#питон #django #sqlite #python

Вопрос:

Как мне использовать подготовленный оператор для вставки НЕСКОЛЬКИХ записей в SQLite с использованием Python / Django?

Ответ №1:

Официальная документация библиотеки Python: Объекты курсора

Библиотеки SQLite Python не имеют готовых объектов statement, но они позволяют вам использовать параметризованные запросы и предоставлять более одного набора параметров.

Редактировать: пример executemany по запросу:

 values_to_insert = [(1,"foo"), (2, "bar"), (3, "baz")]

cursor.executemany("""
    INSERT INTO some_table ('item_num', 'item_name')
    VALUES (?, ?)""", values_to_insert)
  

Комментарии:

1. @Amber: спасибо за ваш ответ. Я пропустил один важный момент, т. Е. это была вставка НЕСКОЛЬКИХ записей.. «execute()» позволяет выполнить только один запрос.. у меня это не сработает 🙂

2. @mahendraliya вот почему .executemany() существует: docs.python.org/library/sqlite3.html#sqlite3.Cursor.executemany

3. @Amber: я также прошел через executemany(), но, к сожалению, должен сказать, что я совершенно новичок как в python, так и в sqlite. Я сомневаюсь, что если у меня есть, скажем, список имен файлов, который я подготовил путем добавления значений внутри объекта list, то как я могу использовать его с executeMany .. это похоже на простую передачу объекта list (скажем, FileList) в executemany()?.. Любой фрагмент кода был бы действительно оценен.. Спасибо.

4. @mahendraliya — добавлен пример executemany использования, как и было запрошено.

5. @Amber: ваш код сработал для меня очень хорошо .. НО я получаю ошибки при попытке запустить executemany() для значений, содержащих неанглийские символы.. ранее это работало с executescript().. Я не знаю, почему это не удается с executemany() ..? У вас есть какие-нибудь идеи?

Ответ №2:

Вы можете использовать executemany() и передать объект iterator, например, для вставки 100 целых чисел и их квадратов:

 def my_iter(x):
    for i in range(x):
        yield i, i*i

cursor.executemany("INSERT INTO my_table VALUES (?, ?)", my_iter(100))