Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Занесение данных в таблицу SQLite [Часть 2]

Занесение данных в таблицу 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-код в один шаг.

con.commit()

Без ключевого слова 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.

lid = cur.lastrowid

Используя lastrowid, мы получаем ID последней вставленной строки.

$ ./lastrow.py
The last Id of the inserted row is 4

После выполнения скрипта мы видим последний ID добавления.

Иметь здоровые сильные зубы это важный плюс не не только для себя, но и для окружающих вас людей. Хорошую стоматологическую клинику весьма сложно найти. Я рекомендую посетить стоматологию проспект Вернадского где новейшие технологии и профессиональный персонал. После посещения стоматологии сразу чувствуется уверенность в себе и в своей улыбке.