Russian Qt Forum
Ноябрь 27, 2024, 06:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: PyQt4+QtSql+SQLITE. Не соединяется с базой!  (Прочитано 13708 раз)
Пытон
Гость
« : Февраль 01, 2012, 19:02 »

Код
Python
from PyQt4 import QtGui, QtCore, QtSql
 
class mainform(QtGui.QWidget):
   def __init__(self):
       QtGui.QWidget.__init__(self)
       self.resize(600, 400)
 
       self.connect()
 
   def connect(self):
       con = QtSql.QSqlDatabase.addDatabase("QSQLITE ", "Base")
       con.setDatabaseName("SQLiteBase/1.s3db")
 
       if not con.open():
           print ("База данных не открылась!")
           print ("-"+con.lastError().text()+"-")
           print (str(con.lastError().type()))
 
       cur = QtSql.QSqlQuery()
       cur.exec("SELECT * FROM One")
       print (cur.lastError().text())
 
 
       con.close()
 
 
 
if __name__ == "__main__":
   import sys
   app = QtGui.QApplication(sys.argv)
   form1 = mainform()
   form1.setWindowTitle("Работа с базами данных в PyQt4")
   form1.show()
   sys.exit(app.exec_())

Люди, пишущие на питоне, объясните, почему не происходит соединение с базой данных? И ведь вроде con.open() срабатывает, но далее по тексту программы команда  print(cur.lastError().text()) выдаёт ошибку "driver not loaded"

Почему он не лоадед? Куда он делся? Вроде ж поддержка в Qt баз данных sqlite идёт "из каробки"? Почему же без проблем работает программа-пример из поставки PyQt, из каталога с примерами?
 
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #1 : Февраль 02, 2012, 08:54 »

Дело может и не в этом, но путь к БД немного странный "SQLiteBase/1.s3db" . Может конечно дело привычки, но если это относительный путь, и устанавливать нужно относительно текущего каталога, я всега пишу "./SQLiteBase/1.s3db"

Еще ты указываешь для соединения имя "Base" - это значит что тебе нунжно будет в конструктор QSqlQuery передавать ссылку на экземпляр QSqlDatabase, так как QSqlQuery без него будет пробовать использовать соединение со стандартным именем. Так что либо убери "Base" либо попробуй так

Код:
from PyQt4 import QtGui, QtCore, QtSql
 
class mainform(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.resize(600, 400)
 
        self.connect()
 
    def connect(self):
        con = QtSql.QSqlDatabase.addDatabase("QSQLITE ", "Base")
        con.setDatabaseName("./SQLiteBase/1.s3db")
 
        if not con.open():
            print ("База данных не открылась!")
            print ("-"+con.lastError().text()+"-")
            print (str(con.lastError().type()))
 
        cur = QtSql.QSqlQuery(con)
        cur.exec("SELECT * FROM One")
        print (cur.lastError().text())
 
 
        con.close()
 
 
 
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    form1 = mainform()
    form1.setWindowTitle("Работа с базами данных в PyQt4")
    form1.show()
    sys.exit(app.exec_())
« Последнее редактирование: Февраль 02, 2012, 08:57 от ecspertiza » Записан
Nimbus
Гость
« Ответ #2 : Февраль 02, 2012, 16:53 »

>"QSQLITE "
А пробел в названии драйвера допустим?
Записан
Пытон
Гость
« Ответ #3 : Февраль 03, 2012, 18:34 »


 Так что либо убери "Base" либо попробуй так

Код:
from PyQt4 import QtGui, QtCore, QtSql
 
class mainform(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.resize(600, 400)
 
        self.connect()
 
    def connect(self):
        con = QtSql.QSqlDatabase.addDatabase("QSQLITE ", "Base")
        con.setDatabaseName("./SQLiteBase/1.s3db")
 
        if not con.open():
            print ("База данных не открылась!")
            print ("-"+con.lastError().text()+"-")
            print (str(con.lastError().type()))
 
        cur = QtSql.QSqlQuery(con)
        cur.exec("SELECT * FROM One")
        print (cur.lastError().text())
 
 
        con.close()
 
 
 
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    form1 = mainform()
    form1.setWindowTitle("Работа с базами данных в PyQt4")
    form1.show()
    sys.exit(app.exec_())

а чего изменилось-то?

п.с. пишу под windows
Записан
Пытон
Гость
« Ответ #4 : Февраль 03, 2012, 18:38 »

Пардон, увидел, что изменилось. Щаз попробую.
Записан
Пытон
Гость
« Ответ #5 : Февраль 04, 2012, 12:45 »

Соединение установилось. Но, блин, что это за мерзопакость, когда в ошибке тебе пишут совсем не то, что есть на самом деле? Причём тут какой-то драйвер, когда просто напросто для QtSqlQuery не было указано с каким объектом соединения работать?

Новый вопрос:
Не получается выбрать данные из таблицы для QtSqlTableModel. С QtSqlQuryModel всё работает без проблем.

Код
Python
from PyQt4 import QtGui, QtCore, QtSql
 
class mainform(QtGui.QWidget):
   def __init__(self):
       QtGui.QWidget.__init__(self)
       self.resize(600, 400)
 
 
       self.view = QtGui.QTableView()
       self.model2 = QtSql.QSqlTableModel()
 
       self.view.setModel(self.model2)
 
       self.layout = QtGui.QVBoxLayout()
       self.layout.addWidget(self.view)
       self.setLayout(self.layout)
 
       self.connect()
       self.get_data_from_table()
 
 
   def connect(self):
       self.con = QtSql.QSqlDatabase.addDatabase("QSQLITE", "Base")
       self.con.setDatabaseName("./SQLiteBase/1.s3db")
 
       if not self.con.open():
           print ("База данных не открылась!")
           print ("-"+self.con.lastError().text()+"-")
           print (str(self.con.lastError().type()))
 
   def get_data_from_table(self):
 
       self.model2.setTable("One")
       self.model2.select()
 
 
 
 
if __name__ == "__main__":
   import sys
   app = QtGui.QApplication(sys.argv)
   form1 = mainform()
   form1.setWindowTitle("Работа с базами данных в PyQt4")
   form1.show()
   sys.exit(app.exec_())
 
 

Вот я указываю self.model2.setTable("One"). А каким макаром он узнает из какого соединения брать эту таблицу-то? Как ему указать, что работать нужно с соединением con? Он мне и показывает пустой QtGui.QTableView() в итоге. Что-то в моём учебнике не дописано. Попытался сам найти среди методов QtSqlTableModel метод для указания соединения, не нашёл.

Плиз, хелп!
Записан
Nimbus
Гость
« Ответ #6 : Февраль 05, 2012, 08:30 »

self.model2 = QtSql.QSqlTableModel(self, self.con)
По идее так её надо создавать, но только уже не в конструкторе, ибо там ещё ничего неизвестно об атрибуте con, а в методе connect Улыбающийся
Записан
Пытон
Гость
« Ответ #7 : Февраль 05, 2012, 10:43 »

Пасиб, попробую.
Записан
Пытон
Гость
« Ответ #8 : Февраль 07, 2012, 18:08 »

Мне интересно, вот указал я для QSqlTableModel таблицу, а в ней двадцать тысяч записей. Он что все двадцать тысяч разом заграбастает? Или как этот механизм работает?
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #9 : Февраль 07, 2012, 20:35 »

нет не все, вроде по 250, остальные по необходимости подгружает
Записан
Пытон
Гость
« Ответ #10 : Сентябрь 08, 2013, 15:35 »

Код
Python
import os
from PyQt4 import QtSql
 
kon = QtSql.QSqlDatabase.addDatabase("QSQLITE")
kon.setDatabaseName("./MainDB/reestr.sqlite3")
print ("Существует ли путь?  "+str(os.path.exists("./MainDB/reestr.sqlite3")))
if not kon.open():
   print ("error")
   print(kon.lastError().text())
else:
   print ("open")
 
Результат работы программы:

Существует ли путь?  True
error
Driver not loaded Driver not loaded
-----
Да что, дери его за ногу, опять не так-то?
В этой же директории лежит другая моя питон-программа, с граф. интерфейсом, с моделями, менюшками, из которой я и скопировал эти две строчки на подключение к БД. Но та программа без проблем подключается, а эта ни в какую!

 Злой
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #11 : Сентябрь 09, 2013, 15:09 »

Может стоит привести "./MainDB/reestr.sqlite3" к абсолютному пути для
kon.setDatabaseName("./MainDB/reestr.sqlite3")
Непонимающий
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Пытон
Гость
« Ответ #12 : Сентябрь 09, 2013, 17:53 »

Пытался. Безрезультатно.
Записан
Пытон
Гость
« Ответ #13 : Сентябрь 09, 2013, 18:05 »

И ведь всё различие между двумя программами: в вышеприведённой соединение создаётся сразу же; в той в другой, упомянутой мною, соединение создаётся в теле метода экземпляра класса основанного на QtGui.QMainWindow. Т.е. там self.kon = QtSql.QSqlDatabase.add... и т.д.
Записан
Пытон
Гость
« Ответ #14 : Сентябрь 09, 2013, 18:40 »

Итить-колотить, что, оказывается, причиной-то всему этому безобразию является!

Без app=QtGui.QApplication(sys.argv) никакого доступа к БД не получишь! Добавляю эту строчку в начало программы - есть подключение к БД, помещаю её в комментарий - нет подключения к БД.


QtSql без QtGui.QApplication не фурычит? А почаму? Непонимающий
« Последнее редактирование: Сентябрь 09, 2013, 18:42 от Пытон » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.149 секунд. Запросов: 22.