Найти - Пользователи
Полная версия: QtSql+Python 3. database is locked Unable to fetch row SQLite при попытке сделать DROP TABLE
Начало » Базы данных » QtSql+Python 3. database is locked Unable to fetch row SQLite при попытке сделать DROP TABLE
1
Pluto
Ни по какой сети, естественно, доступа к этой базе нет. Как узнать: почему моя база “залочилась” от удаления таблиц?
Почему я не могу удалить таблицу?
Изменить в ней данные (Update) - без проблем! Удалить же - ни в какую!
Pluto
Ну всю голову уже сломал!
Ведь ни одна из удаляемых таблиц не используется (пока что) в программе! Ни в какую модель они не помещены, ни к какому другому qt-виджету не прикручены. Никакой менеджер sqlite не запущен. Какого :%;"№%:?%; они залочены-то вдруг?
Pluto
Какая бяка-то получается.
Удаление таблиц было реализовано в методе класса, который сидит в отдельном файле и импортируется в основную программу посредством import. В качестве параметра, я передавал экземпляру этого класса объект-соединение с sqlite-базой. Так вот, пока я не закрыл (con.close()) это передаваемое соединение в теле метода и не создал там новое соединение (con2) drop table не получал доступа! Выходит мой Main.py блокирует доступ к базе из MyClassModul.py?

Объясните мне, почему такая кака творится? Ведь я же использовал в теле метода то же самое соединение, только что исполняемый код (скрипт) физически прописан в другом файле. Из-за этого что ли? Это безобразие! Или не из-за этого?
Lexander
А вы сравните 2 объекта: внутри MyClassModul.py и снаружи (Main.py).
Наверняка они разные.
http://sqlite.org/faq.html#q5
Pluto
Которые два объекта сравнить? Объекты-соединения?
Дык, как же они разными-то могут быть?

Main.py
--------
import MyClassModul
con = QtSql.QSqlDatabase.addDatabase("SQLITE")
con.setDatabaseName(path)
con.open()
tmp = MyClass()
tmp.myMethod(con)
------------
-------------
MyClassModul
---------
class MyClass:
   def MyMethod(con):
        quer = QtSql.QSqlQuery(con)
        quer.exec("DROP TABLE MYTABLE")

Как их, кстати, сравнить-то?
Pluto
Эге! Нашёл причину!
Вовсе она не в “разных” объектах-соединениях. Всё правильно у меня в программке передаётся, одно и то же соединение используется.
Методом проб и ошибок выяснил, что закомментирование в программе единственной строчки ответственной за выборку данных для модели (MyModel.select, где MyModel = QtSql.QSqlTableModel) приводит к работоспособности команды DROP TABLE. Хотя, в модель помещается одна из таблиц, а удалять мне нужно другие (ни в коем случае не эту) таблицы.

Это, значится, мне нужно как-то на момент удаления таблиц из БД отвязывать модель от БД? А потом обратно привязывать и заново селект ей делать? Чой-то как-то некузяво всё это…
Pluto
А если к тому моменту как мне потребовалось удалить какую-нибудь таблицу, я понаделал кучу моделей, которые содержат данные из других таблиц этой БД, мне их всех отвязывать от БД??? Безобразие!
PooH
Pluto
А если к тому моменту как мне потребовалось удалить какую-нибудь таблицу, я понаделал кучу моделей, которые содержат данные из других таблиц этой БД, мне их всех отвязывать от БД??? Безобразие!
Все в порядке. Реляционные базы не рассчитаны на то, чтобы на каждый чих менять схему данных. На каком нибудь оракле вам бы не только модели выгрузить пришлось, но еще и за пивом для DBA сбегать.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB