Как записать список в sqlite
Перейти к содержимому

Как записать список в sqlite

  • автор:

Основные операции с данными

Для добавления данных в 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. И после успешного выполнения данной команды в таблице появится новая строка:

INSERT и добавление данных в SQLite

Стоит отметить, что при добавлении данных необязательно указывать значения абсолютно для всех столбцов таблицы. Например, в примере выше не указано значение для стобца 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);

Добавление данных и значения по умолчанию в SQLite

Если все столбцы поддерживают значения по умолчанию или автогенерацию или значение 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.

Пример вставки строки в таблицу SQLite

Разбор кода

  1. import sqlite3 :
    • На этой строке модуль sqlite3 импортируется в программу.
    • С помощью классов и методов из модуля можно взаимодействовать с базой данных SQLite.
  2. sqlite3.connect() и connection.cursor() :
    • С помощью метода sqlite3.connect() устанавливается соединение с базой данных SQLite из Python.
    • Дальше используется connection.cursor() для получения объекта cursor из объекта соединения.
  3. После этого готовится INSERT-запрос для вставки данных в таблицу. В нем указываются названия колонок и их значения. Всего в таблице 5 колонок.
  4. 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 закрыто

Проверить результат можно, получив данные из таблицы.

Использование переменных в запросе INSERT

Вставка нескольких строк с помощью 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 закрыто

Вставка нескольких строк с помощью executemany()

Разберем последний пример:

  • После подключения к базе данных подготавливается список записей для вставки в таблицу. Каждая из них — это всего лишь строка.
  • Инструкция 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!

Эксперт PythonЭксперт Java

18968 / 9663 / 2710
Регистрация: 21.10.2017
Сообщений: 21,473
Alli_Lupin,

ЦитатаСообщение от Кирилл12321 Посмотреть сообщение

@ Alli_Lupin

iSmokeJC, мда, что-то у меня с внимательностью стало.

Меню пользователя @ Alli_Lupin

Am I evil? Yes, I am!

Эксперт PythonЭксперт Java

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.

Просто Лис

Эксперт Python

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 минуту
Рыжий Лис, Столбцов*

Просто Лис

Эксперт Python

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

Просто Лис

Эксперт Python

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)

Просто Лис

Эксперт Python

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)

Просто Лис

Эксперт Python

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 — добавьте его в пример или хотя бы покажите результат его печати в консоль (простым словам вместо кода я предпочитаю не верить 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *