- en
 - Language: ru
 
- Documentation version: latest
 
Выполнение команд SQL
Для выполнения команд SQL в модуле есть несколько методов:
execute()- метод для выполнения одного выражения SQLexecutemany()- метод позволяет выполнить одно выражение SQL для последовательности параметров (или для итератора)executescript()- метод позволяет выполнить несколько выражений SQL за один раз
Метод execute
Метод execute позволяет выполнить одну команду SQL.
Сначала надо создать соединение и курсор:
In [1]: import sqlite3
In [2]: connection = sqlite3.connect('sw_inventory.db')
In [3]: cursor = connection.cursor()
Создание таблицы switch с помощью метода execute:
In [4]: cursor.execute("create table switch (mac text not NULL primary key, hostname text, model text, location text)")
Out[4]: <sqlite3.Cursor at 0x1085be880>
Выражения SQL могут быть параметризированы - вместо данных можно подставлять специальные значения. За счет этого можно использовать одну и ту же команду SQL для передачи разных данных.
Например, таблицу switch нужно заполнить данными из списка data:
In [5]: data = [
   ...: ('0000.AAAA.CCCC', 'sw1', 'Cisco 3750', 'London, Green Str'),
   ...: ('0000.BBBB.CCCC', 'sw2', 'Cisco 3780', 'London, Green Str'),
   ...: ('0000.AAAA.DDDD', 'sw3', 'Cisco 2960', 'London, Green Str'),
   ...: ('0011.AAAA.CCCC', 'sw4', 'Cisco 3750', 'London, Green Str')]
Для этого можно использовать запрос вида:
In [6]: query = "INSERT into switch values (?, ?, ?, ?)"
Знаки вопроса в команде используются для подстановки данных, которые будут передаваться методу execute.
Теперь можно передать данные таким образом:
In [7]: for row in data:
   ...:     cursor.execute(query, row)
   ...:
Второй аргумент, который передается методу execute, должен быть
кортежем. Если нужно передать кортеж с одним элементом, используется
запись (value, ).
Чтобы изменения были применены, нужно выполнить commit (обратите внимание, что метод commit вызывается у соединения):
In [8]: connection.commit()
Теперь при запросе из командной строки sqlite3, можно увидеть эти строки в таблице switch:
$ litecli sw_inventory.db
Version: 1.0.0
Mail: https://groups.google.com/forum/#!forum/litecli-users
Github: https://github.com/dbcli/litecli
sw_inventory.db> SELECT * from switch;
+----------------+----------+------------+-------------------+
| mac            | hostname | model      | location          |
+----------------+----------+------------+-------------------+
| 0000.AAAA.CCCC | sw1      | Cisco 3750 | London, Green Str |
| 0000.BBBB.CCCC | sw2      | Cisco 3780 | London, Green Str |
| 0000.AAAA.DDDD | sw3      | Cisco 2960 | London, Green Str |
| 0011.AAAA.CCCC | sw4      | Cisco 3750 | London, Green Str |
+----------------+----------+------------+-------------------+
4 rows in set
Time: 0.039s
sw_inventory.db>
Метод executemany
Метод executemany позволяет выполнить одну команду SQL для последовательности параметров (или для итератора).
С помощью метода executemany в таблицу switch можно добавить аналогичный список данных одной командой.
Например, в таблицу switch надо добавить данные из списка data2:
In [9]: data2 = [
   ...: ('0000.1111.0001', 'sw5', 'Cisco 3750', 'London, Green Str'),
   ...: ('0000.1111.0002', 'sw6', 'Cisco 3750', 'London, Green Str'),
   ...: ('0000.1111.0003', 'sw7', 'Cisco 3750', 'London, Green Str'),
   ...: ('0000.1111.0004', 'sw8', 'Cisco 3750', 'London, Green Str')]
Для этого нужно использовать аналогичный запрос вида:
In [10]: query = "INSERT into switch values (?, ?, ?, ?)"
Теперь можно передать данные методу executemany:
In [11]: cursor.executemany(query, data2)
Out[11]: <sqlite3.Cursor at 0x10ee5e810>
In [12]: connection.commit()
После выполнения commit данные доступны в таблице:
$ litecli sw_inventory.db
Version: 1.0.0
Mail: https://groups.google.com/forum/#!forum/litecli-users
Github: https://github.com/dbcli/litecli
sw_inventory.db> SELECT * from switch;
+----------------+----------+------------+-------------------+
| mac            | hostname | model      | location          |
+----------------+----------+------------+-------------------+
| 0000.AAAA.CCCC | sw1      | Cisco 3750 | London, Green Str |
| 0000.BBBB.CCCC | sw2      | Cisco 3780 | London, Green Str |
| 0000.AAAA.DDDD | sw3      | Cisco 2960 | London, Green Str |
| 0011.AAAA.CCCC | sw4      | Cisco 3750 | London, Green Str |
| 0000.1111.0001 | sw5      | Cisco 3750 | London, Green Str |
| 0000.1111.0002 | sw6      | Cisco 3750 | London, Green Str |
| 0000.1111.0003 | sw7      | Cisco 3750 | London, Green Str |
| 0000.1111.0004 | sw8      | Cisco 3750 | London, Green Str |
+----------------+----------+------------+-------------------+
8 rows in set
Time: 0.034s
Метод executemany подставил соответствующие кортежи в команду SQL, и все данные добавились в таблицу.
Метод executescript
Метод executescript позволяет выполнить несколько выражений SQL за один раз.
Особенно удобно использовать этот метод при создании таблиц:
In [13]: connection = sqlite3.connect('new_db.db')
In [14]: cursor = connection.cursor()
In [15]: cursor.executescript('''
    ...:     create table switches(
    ...:         hostname     text not NULL primary key,
    ...:         location     text
    ...:     );
    ...:
    ...:     create table dhcp(
    ...:         mac          text not NULL primary key,
    ...:         ip           text,
    ...:         vlan         text,
    ...:         interface    text,
    ...:         switch       text not null references switches(hostname)
    ...:     );
    ...: ''')
Out[15]: <sqlite3.Cursor at 0x10efd67a0>