Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 7, 2013 19:24:48

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

QtSql+Python 3. database is locked Unable to fetch row SQLite при попытке сделать DROP TABLE

Ни по какой сети, естественно, доступа к этой базе нет. Как узнать: почему моя база “залочилась” от удаления таблиц?
Почему я не могу удалить таблицу?
Изменить в ней данные (Update) - без проблем! Удалить же - ни в какую!

Офлайн

#2 Сен. 8, 2013 09:48:38

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

QtSql+Python 3. database is locked Unable to fetch row SQLite при попытке сделать DROP TABLE

Ну всю голову уже сломал!
Ведь ни одна из удаляемых таблиц не используется (пока что) в программе! Ни в какую модель они не помещены, ни к какому другому qt-виджету не прикручены. Никакой менеджер sqlite не запущен. Какого :%;"№%:?%; они залочены-то вдруг?

Офлайн

#3 Сен. 8, 2013 10:19:09

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

QtSql+Python 3. database is locked Unable to fetch row SQLite при попытке сделать DROP TABLE

Какая бяка-то получается.
Удаление таблиц было реализовано в методе класса, который сидит в отдельном файле и импортируется в основную программу посредством import. В качестве параметра, я передавал экземпляру этого класса объект-соединение с sqlite-базой. Так вот, пока я не закрыл (con.close()) это передаваемое соединение в теле метода и не создал там новое соединение (con2) drop table не получал доступа! Выходит мой Main.py блокирует доступ к базе из MyClassModul.py?

Объясните мне, почему такая кака творится? Ведь я же использовал в теле метода то же самое соединение, только что исполняемый код (скрипт) физически прописан в другом файле. Из-за этого что ли? Это безобразие! Или не из-за этого?

Отредактировано Pluto (Сен. 8, 2013 10:22:53)

Офлайн

#4 Сен. 8, 2013 11:54:59

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

QtSql+Python 3. database is locked Unable to fetch row SQLite при попытке сделать DROP TABLE

А вы сравните 2 объекта: внутри MyClassModul.py и снаружи (Main.py).
Наверняка они разные.
http://sqlite.org/faq.html#q5



Офлайн

#5 Сен. 8, 2013 12:37:47

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

QtSql+Python 3. database is locked Unable to fetch row SQLite при попытке сделать DROP TABLE

Которые два объекта сравнить? Объекты-соединения?
Дык, как же они разными-то могут быть?

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 (Сен. 8, 2013 12:41:59)

Офлайн

#6 Сен. 10, 2013 17:09:09

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

QtSql+Python 3. database is locked Unable to fetch row SQLite при попытке сделать DROP TABLE

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

Это, значится, мне нужно как-то на момент удаления таблиц из БД отвязывать модель от БД? А потом обратно привязывать и заново селект ей делать? Чой-то как-то некузяво всё это…

Офлайн

#7 Сен. 10, 2013 17:25:06

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  2  -
Профиль   Отправить e-mail  

QtSql+Python 3. database is locked Unable to fetch row SQLite при попытке сделать DROP TABLE

А если к тому моменту как мне потребовалось удалить какую-нибудь таблицу, я понаделал кучу моделей, которые содержат данные из других таблиц этой БД, мне их всех отвязывать от БД??? Безобразие!

Офлайн

#8 Сен. 11, 2013 05:39:46

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

QtSql+Python 3. database is locked Unable to fetch row SQLite при попытке сделать DROP TABLE

Pluto
А если к тому моменту как мне потребовалось удалить какую-нибудь таблицу, я понаделал кучу моделей, которые содержат данные из других таблиц этой БД, мне их всех отвязывать от БД??? Безобразие!
Все в порядке. Реляционные базы не рассчитаны на то, чтобы на каждый чих менять схему данных. На каком нибудь оракле вам бы не только модели выгрузить пришлось, но еще и за пивом для DBA сбегать.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано PooH (Сен. 11, 2013 05:44:33)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version