sqlite commit не сохраняет изменения при обновлении с использованием python? - PullRequest
1 голос
/ 12 мая 2019

Описание

У меня есть база данных, которую я уже собрал в python3 с использованием sqlite. До этого момента у меня не было проблем с сохранением изменений коммита (с командами вставки и удаления). Тем не менее, я пытаюсь использовать команду обновления, и мне не удалось сохранить изменения (это только изменяет БД в рабочей памяти, несмотря на вызов commit ().

Цель этого фрагмента кода - заменить нулевые значения в базе данных пустой строкой, поскольку у меня есть другая функция, которая не может обрабатывать нулевые данные. Я нашел решение сделать это здесь: Найти нулевые значения из таблицы и заменить его пробелом - sqlite .

Подробнее

Вот текущий код, который я пытаюсь выполнить:

self.cursor.execute(f'UPDATE {tbl_name} SET {col_name} = IFNULL({col_name}, "")')
self.conn.commit()

Этот код в основном проходит по всей базе данных по одному столбцу за раз и заменяет нулевые значения.

Обратите внимание, что self определяется следующим образом:

Database.conn = sqlite3.connect(self.location + self.name)
Database.cursor = sqlite3.connect(self.location + self.name).cursor()

Как было сказано ранее, это правильно работает; однако он не будет вносить изменения в фактическую базу данных. Это проверяется как браузером БД для sqlite, так и повторным извлечением данных при закрытии и повторным выполнением.

Я также отмечу, что если я закрою эту программу и повторно инициализирую ее для повторного запуска, произойдет ошибка из-за блокировки БД, несмотря на то, что последняя строка моего кода:

Database.conn.commit() # Save (commit) the changes
Database.conn.close() # Close database

Заключение

Заранее спасибо, так как я бился головой об стену с этим и еще нигде не нашел подобной проблемы!

1 Ответ

1 голос
/ 12 мая 2019

Ваше подключение к базе данных не имеет ничего общего с вашим курсором.

Вы делаете

Database.conn = sqlite3.connect(self.location + self.name)
Database.cursor = sqlite3.connect(self.location + self.name).cursor()

Таким образом, создав новое соединение для курсора, следующее Database.conn.commit() не будет фиксировать изменения, которые вы сделали с cursor.

Создайте свой курсор таким образом, чтобы иметь связь между соединением и курсором:

Database.conn = sqlite3.connect(self.location + self.name)
Database.cursor = Database.conn.cursor()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...