Скрипт не добавляет данные в Postgres SQL [Python]

Рейтинг: 0Ответов: 1Опубликовано: 11.04.2023

извиняюсь за глупый возможно глупый вопрос, но я не могу разобраться :)
ChatGPT тоже мне особо не помог)

Суть проблемы:
Делаю скрипт для заполнения базы данных, столкнулся с такой проблемой - данные не вносятся в БД.
Ошибок не выдает, скрипт работает, но данные не вносятся, таблица как была пустой, так она ей и осталась.
ЯП - Python, код прилагается ниже.
Структура таблиц (SQL код) так же прилагается.

Python

"""Скрипт для заполнения данными таблиц в БД Postgres."""
import psycopg2
import csv

class data_base:
    def __init__(self, db_name, password, user='postgres'):
        """
        :param db_name: Название базы данных
        :param user: Имя пользователя (администратора бд) (default = postgres)
        :param password: Пароль
        """
        self.connection = psycopg2.connect(host='localhost', database=db_name,
                              user=user, password=password)
        self.cursor = self.connection.cursor()

    def table_insert(self, from_file='', table_name=''):
        """
        :param from_file: Файл от куда берутся данные для бд,
        расположение должно быть в папке north_data (example: customers_data.csv)
        :param table_name: Название таблицы, куда будут вноситься данные
        """

        with open(f'north_data/{from_file}') as file:
            csv_file = csv.reader(file)
            next(csv_file)
            for i in csv_file:
                val = i[0], i[1], i[2]
                if table_name.lower() == 'orders' or table_name == 'employees':
                    print(f'Добавляем в таблицу {table_name} - {i}')
                    self.cursor.execute(f'INSERT INTO {table_name.lower()} '
                                        f'VALUES {i[0], i[1], i[2], i[3], i[4]}')
                elif table_name.lower() == 'customers':
                    print(f'Добавляем в таблицу Customers {i}')
                    self.cursor.execute(f'INSERT INTO customers(customer_id, customer_title, customer_contact) '
                                        f'VALUES(%s, %s, %s)', (val))
                else:
                    raise Exception(f'Такой таблицы не существует.')

db = data_base('North', '5772')
db.table_insert('employees_data.csv', 'employees')

SQL

CREATE table employees
(
    emp_first_name varchar(100) NOT NULL,
    emp_last_name varchar(100) NOT NULL,
    emp_title varchar(100) NOT NULL,
    emp_birtday varchar(30) NOT NULL,
    notes varchar (999)
);

CREATE table orders
(
    order_id int PRIMARY KEY,
    order_customer varchar(50) NOT NULL,
    order_emp_id int NOT NULL,
    order_date varchar(30) NOT NULL,
    order_destination varchar(150) NOT NULL
);

CREATE table customers
(
    customer_id varchar(20) NOT NULL,
    customer_name varchar(100) NOT NULL,
    customer_contact varchar(50) NOT NULL,

)

Ответы

▲ 0Принят

В любой более-менее серьёзной БД работа с данными производится с помощью транзакций. И если при чтении данных вы можете не обращать на это внимание, то после добавления/изменения данных вы должны сделать либо commit либо rollback, чтобы сохранить либо откатить изменения (даже если вы не открывали транзакцию в явном виде, она всё-равно откроется автоматически). Если вы не делаете ничего из этого, то в какой-то момент (при закрытии курсора или коннекшена) будет осуществлён rollback (хотя в некоторых БД можно включить автокоммит, но в вашем случае его явно нет).

Вывод: нужно делать commit в явном виде, тогда ваши данные сохранятся в БД.

В некоторых БД и при некоторых "уровнях изоляции транзакции" теоретически можно увидеть в БД и незакоммиченные ещё данные, пока транзакция не закрыта, но обычно всё-таки увидеть в БД можно только те данные, для которых был выполнен commit.