Рассмотрим добавление в базу данных PostgreSQL на примере следующей таблицы:
CREATE TABLE people (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
age INTEGER)
Для добавления данных применяется SQL-инструкция INSERT. Для добавления одной строки используем метод execute():
import psycopg2
conn = psycopg2.connect(dbname="metanit", user="postgres", password="123456", host="127.0.0.1")
cursor = conn.cursor()
# добавляем строку в таблицу people
cursor.execute("INSERT INTO people (name, age) VALUES ('Tom', 38)")
# выполняем транзакцию
conn.commit()
print("Данные добавлены")
cursor.close()
conn.close()
Здесь добавляется одна строка, где name = "Tom", а age = 38. Перед выполнением команды INSERT открывается транзакция, для завершения которой необходимо вызвать метод commit() текущего объекта Connection.
С помощью второго параметра в метод execute() можно передать значения для параметров SQL-запроса:
import psycopg2
conn = psycopg2.connect(dbname="metanit", user="postgres", password="123456", host="127.0.0.1")
cursor = conn.cursor()
# данные для добавления
bob = ("Bob", 42)
cursor.execute("INSERT INTO people (name, age) VALUES (%s, %s)", bob)
conn.commit()
print("Данные добавлены")
cursor.close()
conn.close()
В данном случае добавляемые в БД значения представляют кортеж bob. В SQL-запросе вместо конкретных значений используются знаки подстановки %s. Вместо этих символов при выполнении запроса будут вставляться данные из кортежа data. Так, первый элемент кортежа - строка "Bob" передается на место первого плейсхолдера %s, второй элемент - число 42 передается на место второго плейсхолдера %s. То есть в итоге команды SQL будет выглядеть следующим образом:
INSERT INTO people (name, age) VALUES ('Bob', 42)
Также обратите внимание, что НЕ надо помещать плейсхолдер %s в кавычки - psycopg2 делает это автоматически.
И если мы посмотрим на содержимое базы данных, то найдем там все добавленные объекты:
Метод executemany() позволяет вставить набор строк:
import psycopg2
conn = psycopg2.connect(dbname="metanit", user="postgres", password="123456", host="127.0.0.1")
cursor = conn.cursor()
# данные для добавления
people = [("Sam", 28), ("Alice", 33), ("Kate", 25)]
cursor.executemany("INSERT INTO people (name, age) VALUES (%s, %s)", people)
conn.commit()
print("Данные добавлены")
cursor.close()
conn.close()
В метод cursor.executemany() по сути передается то же самое выражение SQL, только теперь данные определены в виде списка кортежей people. Фактически каждый кортеж в этом
списке представляет отдельную строку - данные отдельного пользователя, и при выполнении метода для каждого кортежа будет создаваться свое выражение INSERT INTO