Форум сайта python.su
Ни по какой сети, естественно, доступа к этой базе нет. Как узнать: почему моя база “залочилась” от удаления таблиц?
Почему я не могу удалить таблицу?
Изменить в ней данные (Update) - без проблем! Удалить же - ни в какую!
Офлайн
Ну всю голову уже сломал!
Ведь ни одна из удаляемых таблиц не используется (пока что) в программе! Ни в какую модель они не помещены, ни к какому другому qt-виджету не прикручены. Никакой менеджер sqlite не запущен. Какого :%;"№%:?%; они залочены-то вдруг?
Офлайн
Какая бяка-то получается.
Удаление таблиц было реализовано в методе класса, который сидит в отдельном файле и импортируется в основную программу посредством import. В качестве параметра, я передавал экземпляру этого класса объект-соединение с sqlite-базой. Так вот, пока я не закрыл (con.close()) это передаваемое соединение в теле метода и не создал там новое соединение (con2) drop table не получал доступа! Выходит мой Main.py блокирует доступ к базе из MyClassModul.py?
Объясните мне, почему такая кака творится? Ведь я же использовал в теле метода то же самое соединение, только что исполняемый код (скрипт) физически прописан в другом файле. Из-за этого что ли? Это безобразие! Или не из-за этого?
Отредактировано Pluto (Сен. 8, 2013 10:22:53)
Офлайн
А вы сравните 2 объекта: внутри MyClassModul.py и снаружи (Main.py).
Наверняка они разные.
http://sqlite.org/faq.html#q5
Офлайн
Которые два объекта сравнить? Объекты-соединения?
Дык, как же они разными-то могут быть?
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)
Офлайн
Эге! Нашёл причину!
Вовсе она не в “разных” объектах-соединениях. Всё правильно у меня в программке передаётся, одно и то же соединение используется.
Методом проб и ошибок выяснил, что закомментирование в программе единственной строчки ответственной за выборку данных для модели (MyModel.select, где MyModel = QtSql.QSqlTableModel) приводит к работоспособности команды DROP TABLE. Хотя, в модель помещается одна из таблиц, а удалять мне нужно другие (ни в коем случае не эту) таблицы.
Это, значится, мне нужно как-то на момент удаления таблиц из БД отвязывать модель от БД? А потом обратно привязывать и заново селект ей делать? Чой-то как-то некузяво всё это…
Офлайн
А если к тому моменту как мне потребовалось удалить какую-нибудь таблицу, я понаделал кучу моделей, которые содержат данные из других таблиц этой БД, мне их всех отвязывать от БД??? Безобразие!
Офлайн
PlutoВсе в порядке. Реляционные базы не рассчитаны на то, чтобы на каждый чих менять схему данных. На каком нибудь оракле вам бы не только модели выгрузить пришлось, но еще и за пивом для DBA сбегать.
А если к тому моменту как мне потребовалось удалить какую-нибудь таблицу, я понаделал кучу моделей, которые содержат данные из других таблиц этой БД, мне их всех отвязывать от БД??? Безобразие!
Отредактировано PooH (Сен. 11, 2013 05:44:33)
Офлайн