Основные операции с данными
Для добавления данных в 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 . Наконец, нужно не забыть сохранить изменения в базе.
Вставка списка в ячейку sqlite3
Здравствуйте. Необходимо любым способом вставить список в ячейку. Желательно при помощи декодирования, а не строки, которую потом обрабатывать и создавать новый список. Есть ли у кого готовое решение?
Желательно не таким способом имею ввиду:
1 2 3 4
lst='["test1","test2"]' … cur.execute('''Insert Into table Values('<>')'''.format(lst))
В таком случае придется работать со строкой, а значит нельзя использовать '",' и т.д в элементах списка
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
SQLite3 - вставка данных в ДБ
У меня есть парсер, который собирает информацию и сохраняет её в ДБ. База данных работает на.
Добавление списка в ближайшее sqlite3
Всем привет, подскажите как добавить список в базу данных, состоящего из одного столбца, пробую.
Вставка таблицы в ячейку БД
Помогите пожалуйста разобраться, мне нужно сделать, что бы в ячейке БД хранилась таблица (ексель.
Вставка картинки в ячейку
Добрый день! Проблема такая. Есть динамический список , названия в нём меняются , к каждому.
Вставка даты в ячейку (раздельно)
Здравствуйте. Помогите разобраться: в ячейке А1 прописана дата 21.05.2019, нужно в ячейку B1.
2447 / 913 / 130
Регистрация: 29.01.2013
Сообщений: 5,442
Кирилл12321, с какой СУБД работаете?
Am I evil? Yes, I am!
18968 / 9663 / 2710
Регистрация: 21.10.2017
Сообщений: 21,473
Alli_Lupin,
Сообщение от Кирилл12321
@ Alli_Lupin
iSmokeJC, мда, что-то у меня с внимательностью стало.
Меню пользователя @ Alli_Lupin |
Am I evil? Yes, I am!
18968 / 9663 / 2710
Регистрация: 21.10.2017
Сообщений: 21,473
Alli_Lupin, да бывает, че
870 / 651 / 250
Регистрация: 10.12.2016
Сообщений: 1,588
1 2 3 4 5 6 7 8
>>> lst=["test1","test2"] >>> import json >>> s = json.dumps(lst) >>> s '["test1", "test2"]' >>> json.loads(s) ['test1', 'test2'] >>>
Регистрация: 02.01.2019
Сообщений: 133
vic5710, Пробовал. sqlite3.OperationalError: no such column: "test1", "test2" Он думает, что список - это элементы 2 столбцов
Добавлено через 39 минут
vic5710,
sql='''INSERT INTO Test VALUES ('<>')'''.format(value1)
Вот про что я писал. Если в списке будет знак ' , то он не поймет, где начало и где конец. Например,
sql='''INSERT INTO Test VALUES ('["\'\'test1","test2"]')'''
В этом случае он возьмет это: '["\'
870 / 651 / 250
Регистрация: 10.12.2016
Сообщений: 1,588
Кирилл12321, как пробовал?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
>>> conn = sqlite3.connect('test.db') >>> cur = conn.cursor() >>> cur.execute('create table tbl(txt text);') >>> lst = [1,2,3,4,'q'] >>> tmp = json.dumps(lst) >>> tmp '[1, 2, 3, 4, "q"]' >>> cur.execute('insert into tbl values(?)',(tmp,)) >>> conn.commit() >>> cur.execute('select * from tbl') >>> data = cur.fetchall() >>> for line in data: print(line) ('[1, 2, 3, 4, "q"]',) >>>
Добавлено через 2 минуты
1 2 3 4
>>> for line in data: print(json.loads(line[0])) [1, 2, 3, 4, 'q']
Регистрация: 02.01.2019
Сообщений: 133
Да, так работает. Но нужно, чтобы не зависело от элементов списка. Не понимаю, как это в строку упаковать. Если ''' - используется, ' - используется и " - используется
Добавлено через 2 минуты
Если бы вот так работало, то вопросов бы не было:
sql='''INSERT INTO Test VALUES ('''{}''')'''.format(value1)
Добавлено через 5 минут
lst=['\'\'\'fdsfdsf"','test2']
Список может выглядеть и так получается. Как его можно вставить?
870 / 651 / 250
Регистрация: 10.12.2016
Сообщений: 1,588
Как правило, процесс кодирования JSON называется сериализация. Этот термин обозначает трансформацию данных в серию байтов (следовательно, серийных) для хранения или передачи по сети. Также вы, возможно, уже слышали о термине «маршалинг», но это уже совсем другая область.
Естественно, десериализация — является противоположным процессом декодирования данных, которые хранятся или направлены в стандарт JSON.
Просто Лис
5318 / 3332 / 1021
Регистрация: 17.05.2012
Сообщений: 9,765
Записей в блоге: 9
Сообщение от Кирилл12321
Необходимо любым способом вставить список в ячейку.
Ты явно делаешь что-то не то. Конечно, можно закодировать в строку json, но это не выход.
Сделай две таблицы: в одной хранится идентификатор списка, во второй - элементы списка.
1 2 3 4 5 6
lst=["test1","test2"] cursor.execute('INSERT INTO sometable VALUES (. )') lst_id = connection.insert_id() for i in lst: cursor.execute('INSERT INTO list_item VALUES (?, ?)', lst_id, i)
Добавлено через 2 минуты
Для получения списка назад:
1 2 3 4 5 6 7 8
SELECT list_item.val FROM sometable, list_item WHERE sometable.id = list_item.lst_id AND sometable.id = 42
Добавлено через 47 секунд
Даже проще:
SELECT val FROM list_item WHERE lst_id = 42
Регистрация: 02.01.2019
Сообщений: 133
Рыжий Лис, А если элементов может быть хоть сколько? Как создать такую таблицу, где n-ное количество элементов?
Добавлено через 1 минуту
Рыжий Лис, Столбцов*
Просто Лис
5318 / 3332 / 1021
Регистрация: 17.05.2012
Сообщений: 9,765
Записей в блоге: 9
Сообщение от Кирилл12321
А если элементов может быть хоть сколько?
Ну и что? Элементы же хранятся не в столбцах, а строках.
Добавлено через 20 секунд
Хоть 10, хоть 1000 элементов в одном списке.
Регистрация: 02.01.2019
Сообщений: 133
То есть предлагаете хранить так?
list1
elem1
elem2
list2
elem1
elem2
elem3
Добавлено через 2 минуты
Ну вот так:
id list
1 list1
2 elem1
3 elem2
4 list2
5 elem1
6 elem2
7 elem3
Просто Лис
5318 / 3332 / 1021
Регистрация: 17.05.2012
Сообщений: 9,765
Записей в блоге: 9
Сообщение было отмечено Кирилл12321 как решение
Решение
Вот так:
Таблица sometable
id name
1 list1
2 list2
3 list3
Таблица list_item
id lst_id val
1 1 elem1
2 1 elem2
3 2 elem1
4 2 elem2
5 2 elem3
Добавлено через 2 минуты
list3 здесь пустой
241 / 83 / 28
Регистрация: 01.11.2019
Сообщений: 323
Я вот ни как не могу к инкапсуляции привыкнуть, вечная путаница в этих "?", особенно когда их в запросе много, так что перешел на "f" строки, может это и не правильно, но для меня это намного читабельнее
1 2 3 4 5 6 7
lst=['test1', 'test2'] for i in range(len(lst)): lst[i] = f"""""" sql_txt = f"""Insert Into table Values()""" print(sql_txt)
Просто Лис
5318 / 3332 / 1021
Регистрация: 17.05.2012
Сообщений: 9,765
Записей в блоге: 9
Сообщение от volkomorov
lst=['test1', 'test2']
И как ты восстановишь такой список?
lst = ['fox, pony', 'Trixie is Best Pony']
Добавлено через 2 минуты
Или такой
lst = ['fox, pony', 'Trixie is Best\'" Pony']
241 / 83 / 28
Регистрация: 01.11.2019
Сообщений: 323
Если необходимо в дальнейшем использовать этот список, то лучше новый список создать для запроса, конечно это доп затраты памяти, но все зависит от поставленной задачи
1 2 3 4 5 6
lst= ['fox, pony', 'Trixie is Best\'" Pony'] lsq_sql = [f"""""" for i in range(len(lst))] sql_txt = f"""Insert Into table Values()""" print(sql_txt)
Просто Лис
5318 / 3332 / 1021
Регистрация: 17.05.2012
Сообщений: 9,765
Записей в блоге: 9
Не, я говорю про
1) синтаксически невалидный запрос
INSERT INTO TABLE VALUES('fox, pony', 'Trixie is Best'" Pony')
2) как потом из базы забрать данные и собрать исходный список.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Вставка рисунка в ячейку таблицы
Сабж, как это сделать? Картинка позиционируется поверх ячейки, неудобно вручную подгонять размер.
Вставка поля в ячейку таблицы
Создаю таблицу, в одну ячейку вставляю текст, а в другую никак не могу вставить поле с.
Вставка формулы в ячейку с переменной
Доброго времени суток. Есть код: Worksheets("Лист2").Cells(i + 5, n - 8 + 1).FormulaR1C1 =.
Вставка текста в ячейку по условию
Добрый день! Читал читал да не смог всё таки найти решение своего вопроса )) Имеем в таблице 2.
Вставка картинки в ячейку программно
Здравствуйте, Есть два столбца: id, рисунок имя картинки состоит из id. Например, а.
Добавить список в базу при помощи 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 — добавьте его в пример или хотя бы покажите результат его печати в консоль (простым словам вместо кода я предпочитаю не верить 🙂