Sqlite3 python autoincrement primary key
Рассмотрим основные операции с базой данных SQLite с помощью библиотеки sqlite3 на примере таблицы:
CREATE TABLE people ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER )
Добавление данных
Для добавления данных применяется SQL-инструкция INSERT . Для добавления одной строки используем метод execute() объекта Cursor:
import sqlite3; con = sqlite3.connect("metanit.db") cursor = con.cursor() # добавляем строку в таблицу people cursor.execute("INSERT INTO people (name, age) VALUES ('Tom', 38)") # выполняем транзакцию con.commit()
Здесь добавляется одна строка, где name = «Tom», а age = 38.
Выражение INSERT неявно открывает транзакцию, для завершения которой необходимо вызвать метод commit() текущего объекта Connection.
Установка параметров
С помощью второго параметра в метод execute() можно передать значения для параметров SQL-запроса:
import sqlite3; con = sqlite3.connect("metanit.db") cursor = con.cursor() # данные для добавления bob = ("Bob", 42) cursor.execute("INSERT INTO people (name, age) VALUES (?, ?)", bob) con.commit()
В данном случае добавляемые в БД значения представляют кортеж bob. В SQL-запросе вместо конкретных значений используются знаки подстановки ?. Вместо этих символов при выполнении запроса будут вставляться данные из кортежа data. Так, первый элемент кортежа — строка «Bob» передается на место первого знакак ?, второй элемент — число 42 передается на место второго знака ?.
И если мы посмотрим на содержимое базы данных, то найдем там все добавленные объекты:
Множественная вставка
Метод executemany() позволяет вставить набор строк:
import sqlite3; con = sqlite3.connect("metanit.db") cursor = con.cursor() # данные для добавления people = [("Sam", 28), ("Alice", 33), ("Kate", 25)] cursor.executemany("INSERT INTO people (name, age) VALUES (?, ?)", people) con.commit()
В метод cursor.executemany() по сути передается то же самое выражение SQL, только теперь данные определены в виде списка кортежей people. Фактически каждый кортеж в этом списке представляет отдельную строку — данные отдельного пользователя, и при выполнении метода для каждого кортежа будет создаваться свое выражение INSERT INTO
Получение данных
Для получения данных применяется SQL-команда SELECT . После выполнения этой команды курсор получает данные, которые можно получить с помощью одного из методов: fetchall() (возвращает список со всеми строками), fetchmany() (возвращает указанное количество строк) и fetchone() (возвращает одну в наборе строку).
Получение всех строк
Например, получим все ранее добавленные данные из таблицы people:
import sqlite3; con = sqlite3.connect("metanit.db") cursor = con.cursor() # получаем все данные из таблицы people cursor.execute("SELECT * FROM people") print(cursor.fetchall())
При выполнении этой программы на консоль будет выведен список строк, где каждая строка представляет кортеж:
[(1, 'Tom', 38), (2, 'Bob', 42), (3, 'Sam', 28), (4, 'Alice', 33), (5, 'Kate', 25)]
При необходимости мы можем перебрать список, используя стандартные циклические конструкции:
import sqlite3; con = sqlite3.connect("metanit.db") cursor = con.cursor() cursor.execute("SELECT * FROM people") for person in cursor.fetchall(): print(f" - ")
Результат работы программы:
Tom - 38 Bob - 42 Sam - 28 Alice - 33 Kate - 25
Стоит отметить, что в примере выше необязательно вызывать метод fetchall, мы можем перебрать курсор в цикле как обычный набор:
for person in cursor: print(f" - ")
Получение части строк
Получение части строк с помощью метода fetchmany() , в который передается количество строк:
import sqlite3; con = sqlite3.connect("metanit.db") cursor = con.cursor() cursor.execute("SELECT * FROM people") # извлекаем первые 3 строки в полученном наборе print(cursor.fetchmany(3))
Результат работы программы:
[(1, 'Tom', 38), (2, 'Bob', 42), (3, 'Sam', 28)]
Выполнение этого метода извлекает следующие ранее неизвлеченные строки:
# извлекаем первые 3 строки в полученном наборе print(cursor.fetchmany(3)) # [(1, 'Tom', 38), (2, 'Bob', 42), (3, 'Sam', 28)] # извлекаем следующие 3 строки в полученном наборе print(cursor.fetchmany(3)) # [(4, 'Alice', 33), (5, 'Kate', 25)]
Получение одной строки
Метод fetchone() извлекает следующую строку в виде кортежа значений и возвращает его. Если строк больше нет, то возвращает None :
import sqlite3; con = sqlite3.connect("metanit.db") cursor = con.cursor() cursor.execute("SELECT * FROM people") # извлекаем одну строку print(cursor.fetchone()) # (1, 'Tom', 38)
Данный метод удобно применять, когда нам надо извлечь из базы данных только один объект:
import sqlite3; con = sqlite3.connect("metanit.db") cursor = con.cursor() cursor.execute("SELECT name, age FROM people WHERE раскладываем кортеж на две переменных name, age = cursor.fetchone() print(f"Name: Age: ") # Name: Bob Age: 42
Здесь получаем из бд строку с и полученный результат раскладываем на две переменных name и age (так как кортеж в Python можно разложить на отдельные значения)
Обновление
Для обновления в SQL выполняется команда UPDATE . Например, заменим у всех пользователей имя с Tom на Tomas:
import sqlite3; con = sqlite3.connect("metanit.db") cursor = con.cursor() # обновляем строки, где name = Tom cursor.execute("UPDATE people SET name ='Tomas' WHERE name='Tom'") # вариант с подстановками # cursor.execute("UPDATE people SET name =? WHERE name=?", ("Tomas", "Tom")) con.commit() # проверяем cursor.execute("SELECT * FROM people") print(cursor.fetchall()) # [(1, 'Tomas', 38), (2, 'Bob', 42), (3, 'Sam', 28), (4, 'Alice', 33), (5, 'Kate', 25)]
Для выполнения обновления также надо выполнять метод con.commit()
Удаление данных
Для удаления в SQL выполняется команда DЕLETE . Например, удалим всех пользователей с именем Bob:
import sqlite3; con = sqlite3.connect("metanit.db") cursor = con.cursor() # обновляем строки, где name = Tom cursor.execute("DELETE FROM people WHERE name=?", ("Bob",)) con.commit() # проверяем cursor.execute("SELECT * FROM people") print(cursor.fetchall()) # [(1, 'Tomas', 38), (3, 'Sam', 28), (4, 'Alice', 33), (5, 'Kate', 25)]
Для выполнения удаления также надо выполнять метод con.commit()
Занесение данных в таблицу SQLite [Часть 2]
27 июля 2015 г. Archy Просмотров: 39485 RSS Обсудить
Примеры Python » SQLite python sqlite, sqlite insert, sqlite last id, sqlite последний id, создать таблицу sqlite
Мы создадим таблицу Cars и внесем несколько строк данных в неё.
#!/usr/bin/python # -*- coding: utf-8 -*- import sqlite3 as lite import sys # Подключаемся к базе данных con = lite.connect('test.db') with con: cur = con.cursor() # Создаем таблицу cur.execute("CREATE TABLE Cars(Id INT, Name TEXT, Price INT)") # Вносим данные cur.execute("INSERT INTO Cars VALUES(1, 'Audi', 52642)") cur.execute("INSERT INTO Cars VALUES(2, 'Mercedes', 57127)") cur.execute("INSERT INTO Cars VALUES(3, 'Skoda', 9000)") cur.execute("INSERT INTO Cars VALUES(4, 'Volvo', 29000)") cur.execute("INSERT INTO Cars VALUES(5, 'Bentley', 350000)") cur.execute("INSERT INTO Cars VALUES(6, 'Citroen', 21000)") cur.execute("INSERT INTO Cars VALUES(7, 'Hummer', 41400)") cur.execute("INSERT INTO Cars VALUES(8, 'Volkswagen', 21600)")
Данный скрипт создаёт таблицу Cars и вставляет 8 строк в таблицу.
cur.execute("CREATE TABLE Cars(Id INT, Name TEXT, Price INT)")
Этот SQL-запрос создает новую таблицу Cars. Таблица имеет три столбца.
cur.execute("INSERT INTO Cars VALUES(1,'Audi',52642)") cur.execute("INSERT INTO Cars VALUES(2,'Mercedes',57127)")
Эти две строки добавляют в таблицу данные о двух машин. С использованием ключевого слова with, изменения фиксируются автоматически. В противном случае, мы должны были зафиксировать их вручную.
sqlite> .mode column sqlite> .headers on
Мы проверяем записанные данные консольным инструментом sqlite3. В первую очередь, мы изменяем способ, которым данные отображаются в консоли. Мы используем режим столбцов и включаем заголовки.
sqlite> SELECT * FROM Cars; Id Name Price ---------- ---------- ---------- 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 6 Citroen 21000 7 Hummer 41400 8 Volkswagen 21600
Это данные, которые мы внесли в таблицу Cars.
Мы собираемся создать такую же таблицу, на этот раз используя удобный метод executemany().
#!/usr/bin/python # -*- coding: utf-8 -*- import sqlite3 as lite import sys cars = ( (1, 'Audi', 52642), (2, 'Mercedes', 57127), (3, 'Skoda', 9000), (4, 'Volvo', 29000), (5, 'Bentley', 350000), (6, 'Hummer', 41400), (7, 'Volkswagen', 21600) ) con = lite.connect('test.db') with con: cur = con.cursor() cur.execute("DROP TABLE IF EXISTS Cars") cur.execute("CREATE TABLE Cars(Id INT, Name TEXT, Price INT)") cur.executemany("INSERT INTO Cars VALUES(?, ?, ?)", cars)
Скрипт удаляет таблицу Cars, если она существует и создает ее заново.
cur.execute("DROP TABLE IF EXISTS Cars") cur.execute("CREATE TABLE Cars(Id INT, Name TEXT, Price INT)")
Первый SQL-запрос удаляет таблицу Cars, если она существует. Второй SQL запрос создает таблицу Cars.
cur.executemany("INSERT INTO Cars VALUES(?, ?, ?)", cars)
Мы вводим 8 строк в таблицу, используя метод executemany(). Первый параметр этого метода – это сам SQL запрос. Второй параметр – это данные в форме кортежа. Это более безопасный и уверенный способ внесения данных в базу.
#!/usr/bin/python # -*- coding: utf-8 -*- import sqlite3 as lite import sys try: con = lite.connect('test.db') cur = con.cursor() cur.executescript(""" DROP TABLE IF EXISTS Cars; CREATE TABLE Cars(Id INT, Name TEXT, Price INT); INSERT INTO Cars VALUES(1,'Audi',52642); INSERT INTO Cars VALUES(2,'Mercedes',57127); INSERT INTO Cars VALUES(3,'Skoda',9000); INSERT INTO Cars VALUES(4,'Volvo',29000); INSERT INTO Cars VALUES(5,'Bentley',350000); INSERT INTO Cars VALUES(6,'Citroen',21000); INSERT INTO Cars VALUES(7,'Hummer',41400); INSERT INTO Cars VALUES(8,'Volkswagen',21600); """) con.commit() except lite.Error, e: if con: con.rollback() print "Error %s:" % e.args[0] sys.exit(1) finally: if con: con.close()
В вышеприведённом скрипте, мы пересоздаём таблицу Cars, используя метод executescript().
cur.executescript(""" DROP TABLE IF EXISTS Cars; CREATE TABLE Cars(Id INT, Name TEXT, Price INT); INSERT INTO Cars VALUES(1,'Audi',52642); INSERT INTO Cars VALUES(2,'Mercedes',57127); .
Метод executescript() разрешает нам выполнять целый SQL-код в один шаг.
Без ключевого слова with, изменения должны вступить в силу благодаря использованию метода commit().
except lite.Error, e: if con: con.rollback() print "Error %s:" % e.args[0] sys.exit(1)
В случае ошибки, изменения откатятся назад и сообщение об ошибке выведется в терминале.
Получить ID последнего внесения в базу
Иногда, нам необходимо определить id последней вставленной строки. В Python SQLite, мы используем атрибут lastrowid объекта указателя.
#!/usr/bin/python # -*- coding: utf-8 -*- import sqlite3 as lite import sys con = lite.connect(':memory:') with con: cur = con.cursor() cur.execute("CREATE TABLE Friends(Id INTEGER PRIMARY KEY, Name TEXT);") cur.execute("INSERT INTO Friends(Name) VALUES ('Tom');") cur.execute("INSERT INTO Friends(Name) VALUES ('Rebecca');") cur.execute("INSERT INTO Friends(Name) VALUES ('Jim');") cur.execute("INSERT INTO Friends(Name) VALUES ('Robert');") lid = cur.lastrowid print "The last Id of the inserted row is %d" % lid
Мы создаём таблицу Friends. ID автоматически прибавился.
cur.execute("CREATE TABLE Friends(Id INTEGER PRIMARY KEY, Name TEXT);")
В SQLite, колонка INTEGER PRIMARY KEY прибавляется автоматически. Существует так же параметр AUTOINCREMENT. Для INTEGER PRIMARY KEY AUTOINCREMENT используются слегка разные алгоритмы для создания ID.
cur.execute("INSERT INTO Friends(Name) VALUES ('Tom');") cur.execute("INSERT INTO Friends(Name) VALUES ('Rebecca');") cur.execute("INSERT INTO Friends(Name) VALUES ('Jim');") cur.execute("INSERT INTO Friends(Name) VALUES ('Robert');")
Когда используется авто-инкремент, мы должны явно изложить имена столбцов, пропуская тот, к которому происходит авто-добавление. Четыре оператора вводят четыре строки в таблицу Friends.
Используя lastrowid, мы получаем ID последней вставленной строки.
$ ./lastrow.py The last Id of the inserted row is 4
После выполнения скрипта мы видим последний ID добавления.
Иметь здоровые сильные зубы это важный плюс не не только для себя, но и для окружающих вас людей. Хорошую стоматологическую клинику весьма сложно найти. Я рекомендую посетить стоматологию проспект Вернадского где новейшие технологии и профессиональный персонал. После посещения стоматологии сразу чувствуется уверенность в себе и в своей улыбке.