Добавить список в базу при помощи sqlite3 (Python 3)
Есть список list_rule_1. В нём каждый элемент ‘1523617883276-545841109109949563’ в виде строки. Всего элементов в списке 403. Хочу добавить этот список в базу с именем mydb.sqlite в таблицу conversions в столбец conv_rule. Какой строчкой кода это сделать? И нужно ли список преобразовать в кортеж? Вот с чего я начал:
import sqlite3 conn = sqlite3.connect('mydb.sqlite') cursor = conn.cursor() cursor.execute("CREATE TABLE conversions conv_rule") conn.commit() cursor.executemany("INSERT INTO conversions VALUES (?)", list_rule_1) #с этого момента неработает
Отслеживать
Ihor Sultan
задан 19 мая 2018 в 17:39
Ihor Sultan Ihor Sultan
31 1 1 серебряный знак 5 5 бронзовых знаков
начните со списка с двумя элементами и минимальной таблицы с парой столбцов. Используйте insert/update и executemany(). Если получите неожиданный результат, добавьте в ваш вопрос минимальный пример кода, ввод, ожидаемый вывод и с что вы вместо этого получаете минимальный воспроизводимый пример
19 мая 2018 в 19:45
Пример это хорошо, но он ещё недостаточно самодостаточный. Ответ зависит от того, чем конкретно является list_rule_1 — добавьте его в пример или хотя бы покажите результат его печати в консоль (простым словам вместо кода я предпочитаю не верить 🙂
Основные операции с данными
Для добавления данных в SQLite применяется команда INSERT , которая имеет следующее формальное определение:
INSERT INTO имя_таблицы [(столбец1, стобец2, . стобецN)] VALUES (значение1, значение2, . значениеN)
После выражения INSERT INTO в скобках можно указать список столбцов через запятую, в которые надо добавлять данные, и в конце после слова VALUES скобках перечисляют добавляемые для столбцов значения.
Например, пусть в базе данных SQLite есть следующая таблица users:
CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER );
Добавим в эту таблицу одну строку с помощью следующего кода:
INSERT INTO users (name, age) VALUES ('Tom', 37);
После названия таблицы указываны два стобца, в которые мы хотим выполнить добавление данные — (name, age) . После оператора VALUES указаны значения для этих столбцов. Значения будут передаваться столбцам по позиции. То есть стобцу name передается строка «Tom’, столбцу age — число 37. И после успешного выполнения данной команды в таблице появится новая строка:

Стоит отметить, что при добавлении данных необязательно указывать значения абсолютно для всех столбцов таблицы. Например, в примере выше не указано значение для стобца id, поскольку для данного столбца значение будет автоматически генерироваться.
Также можно можно было бы не указывать названия столбцов:
INSERT INTO users VALUES (2, 'Bob', 41);
Однако в этом случае потребовалось бы указать значения для всех его столбцов, в том числе для столбца id. Причем значения передавались столбцам в том порядке, в котором они идут в таблице.
Добавление NULL
Также мы можем опускать при добавлении такие столбцы, которые поддерживают значение NULL (которые не имеют ограничения NOT NULL ):
INSERT INTO users (name) VALUES ('Sam');
В данном случае для столбца age не указано значение, и поскольку данный столбец поддерживает значение NULL, то для него будет установлено значение NULL.
Также подобным столбцам, которые поддерживают NULL, можно явным образом передать NULL:
INSERT INTO users (name, age) VALUES (NULL, NULL);
Значения по умолчанию
Если для столбца задано ограничение DEFAULT , то есть значение по умолчанию, то для него тоже можно не передавать значение. Например, возьмем следующую таблицу:
CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT DEFAULT 'Undefined', age INTEGER DEFAULT 18 );
Теперь столбцы name и age имеют значения по умолчанию. При добавлении данных из можно опустить:
INSERT INTO users(name) VALUES ('Tom'); INSERT INTO users(age) VALUES (22);

Если все столбцы поддерживают значения по умолчанию или автогенерацию или значение NULL, то с помощью ключевого слова DEFAULT можно явно указать, что в качестве значения будут использоваться значения по умолчанию:
INSERT INTO users DEFAULT VALUES;
В этом случае столбцы, для которых определено значение по умолчанию, получат это значение. Остальные столбцы получать значение NULL.
Множественное добавление
Также мы можем добавить сразу несколько строк:
INSERT INTO users(name, age) VALUES ('Tom', 37), ('Bob', 41), ('Sam', 28);
В данном случае в таблицу будут добавлены три строки.
Динамическая типизация
Стоит отметить, что в SQLite (в отличие от многих других популярных систем баз данных) действует динамическая типизиация. Например, возьмем выше использованную таблицу:
CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER );
Несмотря на то, что столбец name представляет строку текста, а столбец age — целое число, мы можем передавать этим столбцам данные совсем других типов:
INSERT INTO users(name, age) VALUES (37, 'Tom'), (4.5, 5.6), ('Sam', 'twenty-two');
Вставка данных в таблицу SQLite
В этом материале рассматривается, как выполнять операцию Insert в SQLite из Python для добавления новых строк в таблицу:
- Добавление одной или нескольких строк в таблицу SQLite.
- Добавление целых чисел, строк, чисел с плавающей точкой, с двойной точностью, а также значений datetime в таблицу SQLite.
- Использование запросов с параметрами для добавления переменных Python в качестве динамических данных в таблицу.
Перед выполнением следующих программ нужно убедиться, что вам известны название таблицы, а также информация о ее колонках. В этом примере будет использоваться таблица sqlitedb_developers .
Пример вставки строки в таблицу SQLite
Сейчас таблица sqlitedb_developers пустая, и ее нужно заполнить. Для этого необходимо выполнить следующие шаги:
- Установить SQLite-соединение из Python.
- Создать объект Cursor с помощью объекта соединения.
- Создать INSERT-запрос. Для этого нужно знать таблицу и подробности о колонках.
- Выполнить запрос с помощью cursor.execute() .
- После успешного завершения нужно не забыть выполнить коммит изменений в базу данных.
- Также важно не забыть перехватить исключения SQLite.
- Наконец, следует проверить результат, вернув данные из таблицы.
Посмотрим на программу:
import sqlite3
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")
sqlite_insert_query = """INSERT INTO sqlitedb_developers
(id, name, email, joining_date, salary)
VALUES
(1, 'Oleg', 'oleg04@gmail.com', '2020-11-29', 8100);"""
count = cursor.execute(sqlite_insert_query)
sqlite_connection.commit()
print("Запись успешно вставлена в таблицу sqlitedb_developers ", cursor.rowcount)
cursor.close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")Подключен к SQLite Запись успешно вставлена в таблицу sqlitedb_developers 1 Соединение с SQLite закрытоТеперь можно проверить результат, посмотрев таблицу через программу DB Browser.
Разбор кода
- import sqlite3 :
- На этой строке модуль sqlite3 импортируется в программу.
- С помощью классов и методов из модуля можно взаимодействовать с базой данных SQLite.
- sqlite3.connect() и connection.cursor() :
- С помощью метода sqlite3.connect() устанавливается соединение с базой данных SQLite из Python.
- Дальше используется connection.cursor() для получения объекта cursor из объекта соединения.
- После этого готовится INSERT-запрос для вставки данных в таблицу. В нем указываются названия колонок и их значения. Всего в таблице 5 колонок.
- cursor.execute() :
- С помощью метода execute() объекта сursor выполняется запрос INSERT.
- Чтобы сохранить изменения в базе, нужно использовать connection.commit() .
- А с помощью cursor.rowcount можно узнать количество отредактированных строк.
И в блоке finally после завершения операции закрываются объекты cursor и соединение.
Использование переменных в запросе INSERT
Иногда в колонку таблицы нужно вставить значение переменной Python. Этой переменной может быть что угодно: целое число, строка, число с плавающей точкой, datetime . Например, при регистрации пользователь вводит свои данные. Их и можно взять вставить в таблицу SQLite.
Для этого есть запрос с параметрами. Он позволяет использовать переменные Python на месте заполнителей (?) в запросе. Пример:
import sqlite3
def insert_varible_into_table(dev_id, name, email, join_date, salary):
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")
sqlite_insert_with_param = """INSERT INTO sqlitedb_developers
(id, name, email, joining_date, salary)
VALUES (?, ?, ?, ?, ?);"""
data_tuple = (dev_id, name, email, join_date, salary)
cursor.execute(sqlite_insert_with_param, data_tuple)
sqlite_connection.commit()
print("Переменные Python успешно вставлены в таблицу sqlitedb_developers")
cursor.close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")
insert_varible_into_table(2, 'Viktoria', 's_dom34@gmail.com', '2020-11-19', 6000)
insert_varible_into_table(3, 'Valentin', 'exp3@gmail.com', '2020-11-23', 6500)Вывод: таблица sqlitedb_developers после вставки переменной Python в качестве значения колонки.
Подключен к SQLite Переменные Python успешно вставлены в таблицу sqlitedb_developers Соединение с SQLite закрыто Подключен к SQLite Переменные Python успешно вставлены в таблицу sqlitedb_developers Соединение с SQLite закрытоПроверить результат можно, получив данные из таблицы.
Вставка нескольких строк с помощью executemany()
В предыдущем примере для вставки одной записи в таблицу использовался метод execute() объекта cursor , но иногда требуется вставить несколько строчек.
Например, при чтении файла, например, CSV, может потребоваться добавить все записи из него в таблицу SQLite. Вместе выполнения запроса INSERT для каждой записи, можно выполнить все операции в один запрос. Добавить несколько записей в таблицу SQLite можно с помощью метода executemany() объекта cursor .
Этот метод принимает два аргумента: запрос SQL и список записей.
import sqlite3
def insert_multiple_records(records):
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")
sqlite_insert_query = """INSERT INTO sqlitedb_developers
(id, name, email, joining_date, salary)
VALUES (?, ?, ?, ?, ?);"""
cursor.executemany(sqlite_insert_query, records)
sqlite_connection.commit()
print("Записи успешно вставлены в таблицу sqlitedb_developers", cursor.rowcount)
sqlite_connection.commit()
cursor.close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")
records_to_insert = [(4, 'Jaroslav', 'idebylos@gmail.com', '2020-11-14', 8500),
(5, 'Timofei', 'ullegyddomm@gmail.com', '2020-11-15',6600),
(6, 'Nikita', 'aqillysso@gmail.com', '2020-11-27', 7400)]
insert_multiple_records(records_to_insert)Снова проверка с помощью получения данных из таблицы.
Подключен к SQLite Записи успешно вставлены в таблицу sqlitedb_developers 3 Соединение с SQLite закрыто
Разберем последний пример:
- После подключения к базе данных подготавливается список записей для вставки в таблицу. Каждая из них — это всего лишь строка.
- Инструкция SQLite INSERT содержит запрос с параметрами, где на месте каждого значения стоит вопросительный знак.
- Дальше с помощью cursor.executemany(sqlite_insert_query, recordList) в таблицу вставляются несколько записей.
- Чтобы узнать количество вставленных строк используется метод cursor.rowcount . Наконец, нужно не забыть сохранить изменения в базе.
Подключение к БД, создание и удаление таблиц
Для добавления возможности использования СУБД SQLite в программе на Python необходимо импортировать модуль:
import sqlite3
После чего станут доступны API-функции этого расширения. Подробнее о них мы будем говорить на последующих занятиях. А вначале воспользуемся вот такой простой заготовкой для создания и управления БД:
import sqlite3 as sq con = sq.connect("saper.db") cur = con.cursor() cur.execute(""" """) con.close()
Смотрите, в первую очередь мы должны вызвать метод connect, чтобы установить связь с определенной БД. В данном случае – это файл saper.db, который должен располагаться в том же каталоге, что и файл программы на Питоне. В качестве расширений этого файла, обычно, используют следующие:
*.db, *.db3, *.sqlite и *.sqlite3
Я взял первый вариант, т.к. он короткий и понятный. При выполнении команды connect файл saper.db либо будет открыт, либо будет создан, если он не существует. В результате создается (или открывается) БД с именем saper.db.
При успешном соединении с БД метод connect возвращает экземпляр объекта Connection, на который ссылается переменная con. И, далее, мы должны использовать объект Cursor для взаимодействия с БД и выполнения SQL-запросов. Например, это можно сделать с помощью метода execute, которому в качестве аргумента как раз и передается строка с SQL-запросом. Но мы пока там ничего указывать не будем. В конце программы при завершении работы с БД необходимо закрыть соединение. Это делается с помощью метода close.
Вот так в двух словах происходит взаимодействие с СУБД SQLite. Запустим программу, видим, что никаких ошибок не возникло и, кроме того, была создана БД saper.db в виде отдельного файла в каталоге с исполняемым файлом Питона.
Однако, соединяться с БД лучше все-таки через менеджер контекста:
with sq.connect("saper.db") as con: cur = con.cursor() cur.execute(""" """)
Он автоматически сохраняет данные в БД (вызывает метод commit()) даже при возникновении ошибочных ситуаций. Поэтому, в дальнейшем мы им и будем пользоваться. Конечно, после него, когда соединение с БД уже не нужно, его нужно закрыть все той же командой close().
Давайте теперь перейдем в программу DB Browser и откроем эту БД. На экране увидим вот такое окно и, как видите, у нас пока здесь нет ни одной таблицы.

Создание и удаление таблиц
- name – строка с именем игрока;
- sex – число, пол игрока (1 – мужской; 2 – женский);
- old – число, возраст игрока;
- score – суммарное число набранных очков за все игры.
- NULL – значение NULL;
- INTEGER – целочисленный тип (занимает от 1 до 8 байт);
- REAL – вещественный тип (8 байт в формате IEEE);
- TEXT – строковый тип (в кодировке данных базы, обычно UTF-8);
- BLOB (двоичные данные, хранятся «как есть», например, для небольших изображений).
cur.execute("""CREATE TABLE users ( name TEXT, sex INTEGER, old INTEGER, score INTEGER )""")
Мы здесь указываем команду CREATE TABLE (создать таблицу), затем, имя таблицы – users и, далее, в круглых скобках через запятую перечисляем поля с указанием их типов. Названия команд и типов принято писать заглавными буквами, а имена таблиц и их полей – строчными. Мы будем придерживаться этого негласного правила. Запустим программу, снова откроем БД в DB Browser и увидим созданную таблицу заданной структуры. Это будет наше первое хранилище данных. Однако, смотрите, если запустить программу еще раз, то появится ошибка, т.к. мы пытаемся создать таблицу, которая уже существует. Поэтому SQL-запрос лучше записать в таком виде:
cur.execute("""CREATE TABLE IF NOT EXISTS users ( name TEXT, sex INTEGER, old INTEGER, score INTEGER )""")
То есть, создавать таблицу только если она не существует. Теперь, запуская программу, никаких ошибок появляться не будет и, кроме того, мы точно будем уверены, что таблица users присутствует в нашей БД. Давайте в программе DB Browser добавим несколько записей. Для этого нужно нажать на кнопку «Добавить запись» и ввести значения: Алексей 1 22 1000
Миша 1 19 800
Федор 1 26 1100
Маша 2 18 1500 После этого обязательно нажать на кнопку «Записать изменения» и данные будут сохранены в БД. Затем, в этой же программе на вкладке «SQL», мы можем прописывать SQL-запросы и выполнять их. В качестве примера выполним очень распространенную команду SELECT для выбора записей из таблицы users. В самом простом варианте это можно сделать так:
SELECT * FROM users
Здесь * указывает взять все поля из таблицы users. Подробнее мы еще поговорим об этом запросе, а пока я покажу следующее. Каждая таблица SQLite содержит скрытое поле rowid, хранящее уникальный идентификатор записи. Выведем его на экран с помощью запроса:
SELECT rowid, * FROM users
Теперь мы видим значения этого поля для каждой записи. Используя rowid, в частности, можно осуществлять связывание нескольких таблиц между собой для формирования сводного отчета. И в дальнейшем мы увидим как это делается. Наконец, если требуется удалить таблицу, то для этого прописывается такой SQL-запрос:
cur.execute("DROP TABLE users")
Как видите, все довольно просто.
PRIMARY KEY, AUTOINCREMENT, NOT NULL и DEFAULT
При необходимости можно самостоятельно создать поле подобное rowid в любой таблице. Для этого, при создании ее структуры, указывается следующая строчка: user_id INTEGER PRIMARY KEY AUTOINCREMENT Здесь ограничитель PRIMARY KEY (первичный ключ) означает, что поле user_id должно содержать уникальные значения, а ограничитель AUTOINCREMENT указывает СУБД автоматически увеличивать значение user_id при добавлении новой записи. Удалим таблицу users из БД, выполним программу и увидим, что автоматически создается еще одна вспомогательная таблица sqlite_sequence, которая будет хранить служебную информацию для поля user_id. Но, в нашей работе она не нужна, мы по-прежнему пользуемся только одной таблицей users. Далее, если нам нужно указать, что поле обязательно должно содержать какие-либо данные, то ему следует добавить ограничитель NOT NULL, а для задания значения по умолчанию – ограничитель DEFAULT, например, так:
cur.execute("""CREATE TABLE IF NOT EXISTS users ( name TEXT NOT NULL, sex INTEGER DEFAULT 1, old INTEGER, score INTEGER )""")
Теперь, при добавлении новой записи, обязательно нужно будет указывать имя игрока, но можно не указывать его пол, если предполагается мужской:
INSERT INTO users (name, old, score) VALUES('Алексей', 18, 1000)
В результате получим запись: Алексей 1 18 1000 Часто ограничители NOT NULL и DEFAULT объединяют между собой и пишут так:
sex INTEGER NOT NULL DEFAULT 1,
Тогда у нас поле sex обязательно будет содержать значение и по умолчанию оно будет равно 1. Вот так происходит обращение к БД и создание таблиц в SQLite. На следующем занятии мы продолжим изучение команд языка SQL.


